首页 > 其他 > 详细

TOJ 4394 Rebuild Road

时间:2014-02-11 22:01:39      阅读:430      评论:0      收藏:0      [点我收藏+]

描述

    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;
}

TOJ 4394 Rebuild Road

原文:http://www.cnblogs.com/chenjianxiang/p/3544452.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!