题意:求出某个点到其他点的最短路,并求出在最短路情况下的最小费用
分析:用dijkstra求出最短路并同时更新最小费用即可,注意的是在最短路长度相同时费用取最小即可
1 #include <iostream> 2 #include <cstdio> 3 #include <cstring> 4 #include <string> 5 #include <vector> 6 #include <algorithm> 7 #include <set> 8 #include <map> 9 #include <bitset> 10 #include <cmath> 11 #include <queue> 12 #include <stack> 13 using namespace std; 14 const int maxn=20010; 15 const int INF=1<<28; 16 struct edge{ 17 int to,dis,cost; 18 }; 19 typedef pair<int,int> P; 20 int n,m; 21 vector<edge> g[maxn]; 22 int d[maxn]; 23 int pay[maxn]; 24 void dijkstra(int s) 25 { 26 priority_queue<P,vector<P>, greater<P> >que; 27 fill(d,d+n+1,INF); 28 fill(pay,pay+n+1,INF); 29 d[s]=0; 30 que.push(P(0,s)); 31 while(!que.empty()) 32 { 33 P p=que.top(); que.pop(); 34 int v=p.second; 35 if(d[v]<p.first) continue; 36 for(int i=0;i<g[v].size();i++) 37 { 38 edge e=g[v][i]; 39 //cout<<e.to<<"abd"<<endl; 40 if(d[e.to]>d[v]+e.dis){ 41 d[e.to]=d[v]+e.dis; 42 pay[e.to]=e.cost; 43 //num[e.to]=min(num[e.to],pay[e.to]); 44 que.push(P(d[e.to],e.to)); 45 }else if(d[e.to]==d[v]+e.dis){ 46 pay[e.to]=min(e.cost,pay[e.to]); 47 } 48 } 49 } 50 } 51 int main() 52 { 53 while(cin>>n>>m) 54 { 55 if(n+m==0) break; 56 for(int i=0;i<=maxn-1;i++) g[i].clear(); 57 for(int i=0;i<m;i++) 58 { 59 int u,v,d,c; 60 scanf("%d%d%d%d",&u,&v,&d,&c); 61 edge e; 62 e.to=v,e.dis=d,e.cost=c; 63 g[u].push_back(e); 64 edge e1; 65 e1.to=u,e1.dis=d,e1.cost=c; 66 g[v].push_back(e1); 67 } 68 dijkstra(1); 69 int sum=0; 70 for(int i=2;i<=n;i++){ 71 sum+=pay[i]; 72 } 73 cout<<sum<<endl; 74 } 75 return 0; 76 }