5 4 5 1 1 3 3 2 5 4 2 2 1 2 1 2
INF INF INF INF 2 2
4 4 1 2 2 3 3 4 2 4 答案: INF 20 18 20很多代码都是过不了遮住测试数据的不掉的。
#include <stdio.h> #include <string.h> #define MAX 150 #define INF 1000000000 struct Point{ int x, y ; }p[MAX*30] ; int c[MAX][MAX]; int graph[MAX][MAX] , sum[MAX]; int dis[MAX] ; bool visited[MAX] ; int dijkstra(int n,int s) { memset(visited,false,sizeof(visited)) ; for(int i = 1 ; i <= n ; ++i) { dis[i] = graph[s][i] ; } dis[s] = 0 ; visited[s] = true ; int sumt = 0 ; for(int i = 1 ; i < n ; ++i) { int index = -1 , min = INF ; for(int j = 1 ; j <= n ; ++j) { if(!visited[j] && min>dis[j]) { index = j ; min = dis[j] ; } } if(index == -1) { return INF ; } sumt += min ; visited[index] = true ; for(int j = 1 ; j <= n ; ++j) { if(!visited[j] && dis[j]>dis[index]+graph[index][j]) { dis[j] = dis[index] + graph[index][j] ; } } } return sumt ; } int main() { int n , m ; while(~scanf("%d%d",&n,&m)) { memset(c,0,sizeof(c)) ; for(int i = 0 ; i < MAX ; ++i) { for(int j = 0 ; j < MAX ; ++j) { graph[i][j] = INF ; } } for(int i = 0 ; i < m ; ++i) { int x , y ; scanf("%d%d",&x,&y) ; p[i].x = x , p[i].y = y ; c[x][y]++ ,c[y][x]++ ; graph[x][y] = graph[y][x] = 1 ; } bool flag = true ; int ans = 0 ; for(int i = 1 ; i <= n ; ++i) { if(flag) { sum[i] = dijkstra(n,i) ; if(sum[i] == INF) { flag = false ; } ans += sum[i] ; } } for(int i = 0 ; i < m ; ++i) { if(!flag) { puts("INF") ; } else { if(c[p[i].x][p[i].y]>1) { printf("%d\n",ans) ; } else { graph[p[i].x][p[i].y] = graph[p[i].y][p[i].x] = INF ; int sumx = dijkstra(n,p[i].x) ; int sumy = dijkstra(n,p[i].y) ; if(sumx == INF || sumy == INF) { puts("INF") ; } else { printf("%d\n",ans+sumx+sumy-sum[p[i].x]-sum[p[i].y]) ; } graph[p[i].x][p[i].y] = graph[p[i].y][p[i].x] = 1 ; } } } } return 0 ; }
hdu 2433 Travel 最短路 dijkstra算法。
原文:http://blog.csdn.net/lionel_d/article/details/44677809