Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)
Total Submission(s): 41094 Accepted Submission(s): 11882
1 #include <bits/stdc++.h> 2 #define inf 0X3F3F3F3F 3 using namespace std; 4 5 #define INF 0X3F3F3F3F 6 struct Node{ 7 int val; 8 int price; 9 }; 10 11 Node mp[1010][1010]; 12 int dis[1010], cost[1010], vis[1010]; 13 14 int n, m, x, y, k, z, s, t; 15 16 void short_path(int a){ 17 for(int i = 1; i <= n; i++){ 18 dis[i] = mp[a][i].val; 19 cost[i] = mp[a][i].price; 20 } 21 memset(vis, 0, sizeof(vis)); 22 dis[a] = 0; 23 cost[a] = 0; 24 vis[a] = 1; 25 for(int i = 1; i < n; i ++){ 26 int u; 27 int mi = inf; 28 int va = inf; 29 for(int j = 1; j <= n; j++){ 30 if(!vis[j] && dis[j] < mi){ 31 mi = dis[j]; 32 va = cost[j]; 33 u = j; 34 }else if(!vis[j] && dis[j] == mi && cost[j] < va){ 35 va = cost[j]; 36 u = j; 37 } 38 } 39 vis[u] = 1; 40 for(int j = 1; j <= n; j++){ 41 if(mp[u][j].val < inf && !vis[j]){ 42 if(dis[j] > dis[u] + mp[u][j].val){ 43 dis[j] = dis[u] + mp[u][j].val; 44 cost[j] = cost[u] + mp[u][j].price; 45 }else if(dis[j] == dis[u] + mp[u][j].val){ 46 cost[j] = min(cost[j], cost[u] + mp[u][j].price); 47 } 48 } 49 } 50 } 51 } 52 53 54 int main(){ 55 56 while(~scanf("%d%d", &n, &m) && (n || m)){ 57 memset(mp,inf,sizeof(mp)); 58 for(int i = 0; i < m; i ++){ 59 scanf("%d%d%d%d", &x,&y,&k,&z); 60 if(mp[x][y].val > k){ 61 mp[x][y].val = mp[y][x].val = k; 62 mp[x][y].price = mp[y][x].price = z; 63 }else if(mp[x][y].val == k){ 64 mp[x][y].price = mp[y][x].price = min(k,mp[x][y].price); 65 } 66 } 67 scanf("%d%d",&s,&t); 68 short_path(s); 69 printf("%d %d\n", dis[t], cost[t]); 70 } 71 return 0; 72 }
原文:https://www.cnblogs.com/zllwxm123/p/10853344.html