方法一: dijstra + DFS
View Code
1 #include <stdio.h> 2 #include <string.h> 3 4 const int INF = 10000000 ; 5 int map[505][505]; 6 int dist[505]; 7 int teamNum[505]; 8 int visit[505]; 9 int N , M, C1, C2; 10 int pathNum, maxTeamNum; 11 void initApp() 12 { 13 int temp, m, n, i, j; 14 memset(visit, 0, sizeof(int)*505); 15 for( i =0; i< N ;i++) 16 for( j = 0; j< N; j++) 17 if(i != j) 18 map[i][j] = map[j][i] = INF; 19 20 //init the team number 21 for(i = 0; i< N; i++) 22 { 23 scanf("%d", &temp); 24 teamNum[i] = temp; 25 } 26 27 //init the map 28 for(m = 0; m < M; m++) 29 { 30 scanf("%d %d %d", &i, &j, &temp); 31 map[i][j] = map[j][i] = temp; 32 } 33 } 34 void Dijkstra() 35 { 36 int i,j; 37 for(i = 0; i < N; i++) 38 dist[i] = map[C1][i]; 39 visit[C1] = 1; 40 41 int min, minValue, value; 42 for(i = 1; i < N; i++) 43 { 44 min = -1; minValue = INF; 45 46 //find the next Node 47 for(j = 0; j< N ;j++){ 48 49 if(visit[j] == 0 && dist[j] < minValue) 50 { 51 minValue = dist[j]; 52 min = j; 53 } 54 } 55 //no next node or has find the target node 56 if(min == -1|| min == C2) 57 break; 58 59 //mark the node 60 visit[min] = 1; 61 //update the distance information 62 for(j = 0; j < N; j++) 63 { 64 if(visit[j] == 0) 65 { 66 value = dist[min] + map[min][j]; 67 if(map[min][j] != INF && value < dist[j]) 68 dist[j] = value; 69 70 } 71 } 72 73 } 74 } 75 void dfs(int currentId, int currentDis, int currentNum) 76 { 77 int i ; 78 visit[currentId] = 1; 79 //has find the destination 80 if(currentId == C2) 81 { 82 if(currentDis == dist[C2]) 83 { 84 pathNum++; 85 if(currentNum > maxTeamNum) 86 maxTeamNum = currentNum; 87 } 88 return; 89 } 90 //current distance has larger than the length of the shortest path 91 if(currentDis > dist[C2]) 92 return ; 93 94 for(i = 0; i< N; i++) 95 { 96 if(0 == visit[i] && map[currentId][i]!= INF) 97 { 98 dfs(i,currentDis+map[currentId][i],currentNum + teamNum[i] ); 99 visit[i] = 0; 100 } 101 } 102 103 104 } 105 int main(int argc, char *argv[]) 106 { 107 int flag = 0; 108 109 while(scanf("%d", &N)!= EOF){ 110 111 pathNum = 0; 112 maxTeamNum = 0; 113 scanf("%d %d %d", &M, &C1, &C2); 114 initApp(); 115 Dijkstra(); 116 memset(visit, 0 , sizeof(int)*505); 117 dfs(C1, 0, teamNum[C1]); 118 119 if (flag == 0) 120 flag = 1; 121 else 122 printf("\n"); 123 124 printf("%d %d", pathNum, maxTeamNum); 125 } 126 127 return 0; 128 }
方法二: 改动后的dijstra
方法二增加了两个数组,一个用来记录从源节点到当前节点路径的条数(pathNum[505]),一个用来记录从源节点到达当前节点的最大救援队的数目(maxTeamNum[])
对方法的改动主要再三方面:
1)pathNum的初始化,源节点与当前节点联通时,初始化为一否则为零;maxTeamNum的初始化,源节点与当前节点联通时,初始化为源节点救援队的数目加上当前节点救援
队的数目,否则为零
2)找到下一个最短距离的点p对别的点进行更新时。当p点距离加上p到当前节点距离小于当前节点的最短距离时,更新当前节点的最短距离。并更新maxTeamNum 和 pathNum,pathNum
为p点的值,maxTeamNum 为p点的maxTeamNum+ 当前节点的teamNum
3)找到下一个最短距离的点p对别的点进行更新时。当p点距离加上p到当前节点距离等于于当前节点的最短距离时,更新当前节点的最短距离。并更新maxTeamNum 和 pathNum,当前节点的
pathNum = pathNum + p点的pathNum; 当p点的maxTeamNum + 当前节点的teamNum 大于当前节点的maxTeamNum 时,更新当前节点的maxTeamNum
View Code
1 #include <stdio.h> 2 #include <string.h> 3 4 const int INF = 10000000 ; 5 int map[505][505]; 6 int dist[505]; 7 int teamNum[505],maxTeamNum[505],pathNum[505]; 8 int visit[505]; 9 int N , M, C1, C2; 10 void initApp() 11 { 12 int temp, m, n, i, j; 13 14 memset(visit, 0, sizeof(int)*505); 15 memset(maxTeamNum, 0, sizeof(int)*505); 16 memset(pathNum, 0, sizeof(int)*505); 17 18 for( i =0; i< N ;i++) 19 for( j = 0; j< N; j++) 20 if(i != j) 21 map[i][j] = map[j][i] = INF; 22 23 //init the team number 24 for(i = 0; i< N; i++) 25 { 26 scanf("%d", &temp); 27 teamNum[i] = temp; 28 } 29 30 //init the map 31 for(m = 0; m < M; m++) 32 { 33 scanf("%d %d %d", &i, &j, &temp); 34 map[i][j] = map[j][i] = temp; 35 } 36 } 37 void Dijkstra() 38 { 39 40 int i,j; 41 int temp = teamNum[C1] ; 42 43 //初始化距离与 路径条数 以及最大救援数目 44 for(i = 0; i < N; i++) 45 { 46 dist[i] = map[C1][i]; 47 if(dist[i]!= INF) 48 { 49 pathNum[i] = 1; 50 maxTeamNum[i] =teamNum[i]+ temp ; 51 } 52 } 53 54 dist[C1] = 0; 55 maxTeamNum[C1] = temp; 56 visit[C1] = 1; 57 58 int min, minValue, value; 59 for(i = 1; i < N; i++) 60 { 61 min = -1; minValue = INF; 62 63 //find the next Node 64 for(j = 0; j< N ;j++){ 65 66 if(visit[j] == 0 && dist[j] < minValue) 67 { 68 minValue = dist[j]; 69 min = j; 70 } 71 } 72 //no next node or has find the target node 73 if(min == -1|| min == C2) 74 break; 75 76 //mark the node 77 visit[min] = 1; 78 //update the distance information 79 for(j = 0; j < N; j++) 80 { 81 if(visit[j] == 0) 82 { 83 value = dist[min] + map[min][j]; 84 if(map[min][j] != INF && value < dist[j]) 85 { 86 dist[j] = value; 87 maxTeamNum[j] = teamNum[j] + maxTeamNum[min]; 88 pathNum[j] = pathNum[min] ; 89 } 90 else if(map[min][j] != INF && value == dist[j]) 91 { 92 pathNum[j] += pathNum[min]; 93 if(maxTeamNum[j] < teamNum[j] + maxTeamNum[min]) 94 maxTeamNum[j] = teamNum[j] + maxTeamNum[min]; 95 } 96 97 } 98 } 99 100 } 101 } 102 int main(int argc, char *argv[]) 103 { 104 int flag = 0; 105 106 while(scanf("%d", &N)!= EOF){ 107 108 scanf("%d %d %d", &M, &C1, &C2); 109 initApp(); 110 Dijkstra(); 111 memset(visit, 0 , sizeof(int)*505); 112 113 if (flag == 0) 114 flag = 1; 115 else 116 printf("\n"); 117 118 printf("%d %d", pathNum[C2], maxTeamNum[C2]); 119 } 120 121 return 0; 122 }