您的位置:首页 > 其它

zoj3946 Highway Project

2016-04-24 12:52 267 查看
K. Highway Project

t->测试数据组

n,m->n个点,m条可建边

x,y,d,c->x与y有可以建边,经过此边为d 时间,建边需c费用

#include <bits/stdc++.h>
using namespace std;

typedef long long ll;
const int N=100005;
const ll inf=1e12;

struct node{
int v;
ll dist,cost;
node(int _v,ll _dist,ll _cost){
v=_v;
dist=_dist;
cost=_cost;
}
bool operator < (const node& p) const{
return dist>p.dist;
}
};

vector <node> v
;
priority_queue <node>q;
bool vis
;
ll dis
,cost
;

void dijkstra(int n,int s){
for(int i=0;i<n;i++){
dis[i]=inf;
cost[i]=inf;
}
while(!q.empty()) q.pop();
q.push(node(0,0,0));
dis[0]=0;
cost[0]=0;
while(!q.empty()){
node p=q.top();
q.pop();
if(vis[p.v]) continue;
vis[p.v]=1;
// cout<<p.v<<" "<<p.dist<<" "<<p.cost<<endl;
for(int i=0;i<v[p.v].size();i++){
node pp=v[p.v][i];
int to=pp.v;
int _dis=pp.dist;
//cout<<dis[p.v]<<endl;
//  cout<<p.v<<" "<<pp.v<<" "<<pp.dist<<" "<<pp.cost<<endl;
if(dis[to]>dis[p.v]+_dis){
dis[to]=dis[p.v]+_dis;
cost[to]=pp.cost;
q.push(node(to,dis[to],cost[to]));
}else if(dis[to]==dis[p.v]+_dis&&cost[to]>pp.cost){
//pp.dist=p.dist+_dis;
cost[to]=pp.cost;
q.push(node(to,dis[to],cost[to]));
}
}
}
ll ans1=0,ans2=0;
for(int i=0;i<n;i++){
ans1+=dis[i];
ans2+=cost[i];
// cout<<dis[i]<<endl;
}
cout<<ans1<<" "<<ans2<<endl;
}

int main()
{
int t;
scanf("%d",&t);
while(t--){
int n,m;
scanf("%d%d",&n,&m);
int x,y,d,c;
memset(v,0,(n+1)*sizeof v[0]);
memset(vis,false,sizeof vis);
for(int i=0;i<m;i++){
scanf("%d%d%d%d",&x,&y,&d,&c);
v[x].push_back(node(y,d,c));
v[y].push_back(node(x,d,c));
}
dijkstra(n,0);
}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: