http://ac.jobdu.com/problem.php?pid=1008

题目描述:
给你n个点,m条无向边,每条边都有长度d和花费p,给你起点s终点t,要求输出起点到终点的最短距离及其花费,如果最短距离有多条路线,则输出花费最少的。
输入:
输入n,m,点的编号是1~n,然后是m行,每行4个数 a,b,d,p,表示a和b之间有一条边,且其长度为d,花费为p。最后一行是两个数 s,t;起点s,终点t。n和m为0时输入结束。
(1
输出:
输出 一行有两个数, 最短距离及其花费。
样例输入:
3 2
1 2 5 6
2 3 4 5
1 3
0 0
样例输出:
9 11

[cpp]  view plain copy
  1. #include   
  2. #include   
  3. #include   
  4. #include   
  5. #include   
  6. #include   
  7. #include   
  8. #include   
  9. using namespace std;  
  10. #define MAX 0Xfffffff  
  11. struct Node{  
  12.     int p, d;  
  13.     int th;  
  14.     bool operator<(const Node& node)const{  
  15.         if(d==node.d)  
  16.             return p
  17.         return d
  18.     }  
  19. };  
  20. bool visit[1001];  
  21. int mapd[1001][1001];  
  22. int mapp[1001][1001];  
  23. int dis[1001];  
  24. int ps[1001];  
  25. priority_queue q;    
  26.   
  27. int main(){  
  28.   
  29.     //freopen("in.txt", "r", stdin);  
  30.       
  31.     int n, m;  
  32.     int a, b, d, p;  
  33.     while(cin>>n>>m, n+m){  
  34.         for(int i=1;i<=n;++i){  
  35.             visit[i] = false;  
  36.             dis[i] = MAX;  
  37.             ps[i] = MAX;  
  38.             for(int j=1;j<=n;++j){  
  39.                 if(i==j){  
  40.                     mapd[i][j] = mapp[i][j] = 0;  
  41.                     continue;  
  42.                 }  
  43.                 mapd[i][j] = MAX;  
  44.                 mapp[i][j] = MAX;  
  45.             }  
  46.         }  
  47.   
  48.         for(int i=0;i
  49.             scanf("%d%d%d%d", &a, &b, &d, &p);  
  50.             if(d
  51.                 mapd[a][b] = mapd[b][a] = d;  
  52.                 mapp[a][b] = mapp[b][a] = p;  
  53.             }else if(d==mapd[a][b]&&p//这种情况应该考虑进去,否则会出错  
  54.                 mapp[a][b] = mapp[b][a] = p;  
  55.             }  
  56.         }  
  57.         int s, t;  
  58.         cin>>s>>t;  
  59.         Node node;  
  60.         node.th = s;  
  61.         node.d = 0;  
  62.         node.p = 0;  
  63.         dis[s] = 0;  
  64.         visit[s] = true;  
  65.         q.push(node);  
  66.         while(!q.empty()){  
  67.             Node node = q.top();  
  68.             q.pop();  
  69.             visit[node.th] = true;  
  70.             for(int i=1;i<=n;++i){  
  71.                 if(i!=node.th && mapd[node.th][i]!=MAX && !visit[i]){   //遍历过的结点当然不能再取遍历了  
  72.                     if(node.d + mapd[node.th][i] < dis[i]){  
  73.                         dis[i] = node.d + mapd[node.th][i];  
  74.                         ps[i] = node.p + mapp[node.th][i];  
  75.                         Node tmp;  
  76.                         tmp.th = i;  
  77.                         tmp.d = dis[i];  
  78.                         tmp.p = ps[i];  
  79.                         q.push(tmp);  
  80.                     }else if(node.d + mapd[node.th][i] == dis[i] && node.p + mapp[node.th][i] < ps[i]){  
  81.                         ps[i] = node.p + mapp[node.th][i];  
  82.                         Node tmp;  
  83.                         tmp.d = dis[i];  
  84.                         tmp.p = ps[i];  
  85.                         tmp.th = i;  
  86.                         q.push(tmp);  
  87.                     }  
  88.                   
  89.                       
  90.                 }  
  91.             }  
  92.   
  93.         }  
  94.       
  95.          printf("%d %d\n", dis[t], ps[t]);  
  96.   
  97.     }  
  98.       
  99.     //fclose(stdin);  
  100. }     

你可能感兴趣的:(zju)