描述
Once,in a kingdom,there are N cities.M roads have been buit such that from one city you can reach any other cities.Between any two cities there is at most one road.But after a series war,D road are destoryed.The king wants to repair the road system.There are two important cities A and B,The king wants to make the two cities connected as soon as possible.Now it is your job to repair some roads such that A and B are connected and the length of all roads repaired is minimun.
输入
Input may contain seveal test data sets.
For each data set, the first line contain an integer N(2<N<100),indicating the number of cities.The cities are numbered from 1 To N.then the second line contains an integer M ( N-1<M<N*(N-1)/2),indicating the number of roads.Next come M lines,each contains three integers I,J,K,which means that there is a road between I and J,whose length is K.
Then next line contains an integer D(1<=D<=M),indicating the number of roads which are destoryed.The following D lines each contain two integer I,J,which means that the road which directly connected city I and J has been destoryed.
The last line contains two integer A,B,indicating the two important cities.
Input is ended by N = 0,which should not be processed.
输出
For each test case,just output one line with the total length of the roads needed to repair such that A and B are connected.If we could not raech B from A,output"-1".
样例输入
3
2
1 2 1
2 3 2
1
1 2
1 3
0
样例输出
1
每个城市之间都有一些路连接,某些城市之间的有遭到了破坏,现在要求我们求修路的最短长度。
如果修完所有的路也无法保证通行则输出-1。
逆向思维,让城市之间已经存在的路的长度为0,需要修补的初始化要修补的路的长度。这样就变成了简单的单源最短路径问题了。
#include <stdio.h> #include <string.h> #define MAXN 110 #define inf 0x3f3f3f3f int N; int m1[MAXN][MAXN]; int m2[MAXN][MAXN]; int dist[MAXN]; int visited[MAXN]; void dijkstra(int begin){ int i,j,k; k=begin; for(j=1; j<=N; j++){ visited[j]=0; if(j!=k){ dist[j]=m2[k][j]; } } visited[k]=1; for(i=1;i<N-1;i++){ int min=inf; k=0; for(j=1; j<=N; j++){ if(!visited[j]&&dist[j]<min){ min=dist[j]; k=j; } } if(k==0)break; visited[k]=1; for(j=1; j<=N; j++){ if(!visited[j]&& dist[k]+m2[k][j]<dist[j]){ dist[j]=dist[k]+m2[k][j]; } } } } int main(){ int M,D,a,b,c; int B,E; while( scanf("%d",&N)!=EOF && N){ for( int i=1 ;i<=N; i++ ){ for( int j=1; j<=N; j++ ){ if(i==j)m2[i][j]=0; else m2[i][j]=inf; } } scanf("%d",&M); for( int i=0; i<M; i++ ){ scanf("%d%d%d",&a,&b,&c); m1[a][b]=c; m1[b][a]=c; m2[a][b]=0; m2[b][a]=0; } scanf("%d",&D); for( int i=0; i<D; i++ ){ scanf("%d%d",&a,&b); m2[a][b]=m1[a][b]; m2[b][a]=m1[b][a]; } scanf("%d%d",&B,&E); dijkstra(B); if(dist[E]==inf){ printf("-1\n"); }else{ printf("%d\n",dist[E]); } } return 0; }