1089: 最短路入门2(道路重建)

来源:互联网 发布:126邮箱ssl协议端口号 编辑:程序博客网 时间:2024/06/08 17:28

题目描述

【题意】
从前有个王国,王国有N个城市,M条道路。两个城市之间最多只有一条道路。战争过后,有D条道路被摧毁了。国王想重建道路,使得最重要的两个城市A和B互通。
你的工作就是决定重建哪些道路能使得AB相连并且重建的道路的长度总和最少。
【输入格式】
本题有多组数据。
第一行为两个整数N,M(2 < N≤100,N-1≤M≤>N*(N-1)/2),城市的编号为1、2、3…N。
下来M行,每行三个整数x,y,c(1≤x,y≤N,x≠y,0<c≤1000),表示城市x和城市y之间有直接的道路长度为c
下来一行为一个整数D(1≤D≤M),表示被摧毁的道路的数目。
下来D行每行两个整数I,J,表示城市I和J之间的道路被摧毁。
最后一行为两个整数A和B。表示两个重要的城市。
【输出格式】
每组输出一行,一个整数,表示重建道路的长度的总和的最小值。
【样例输入】
3 2
1 2 1
2 3 2
1
1 2
1 3
【样例输出】
1


只要把没摧毁的道路距离变成0,然后用Dijkstra

#include<iostream>#include<cstdio>#include<cstring>#include<cstdlib>#include<algorithm>#include<cmath>#include<queue>using namespace std;const int INF=1<<29;typedef pair<int,int> P;int n,m,x,y;int ma[200][200]; int bad[200][200]={0};int v[200]={0};int len[200]={0};void Dijkstra(int x){for(int i=1;i<=n;i++){v[i]=0,len[i]=INF;} len[x]=0;priority_queue< P,vector<P>,greater<P> > que;que.push({len[x],x});while(que.size()){P p=que.top();que.pop();int num=p.second;if(v[num]) continue;v[num]=1;for(int i=1;i<=n;i++){if(ma[i][num]!=INF&&len[i]>len[num]+ma[i][num]){len[i]=len[num]+ma[i][num];que.push({len[i],i});}}}}int main(){while(cin>>n>>m){for(int i=1;i<=n;i++){for(int j=1;j<=n;j++) ma[i][j]=INF,bad[i][j]=0;}for(int i=0;i<m;i++){int a,b,c;cin>>a>>b>>c;ma[a][b]=ma[b][a]=c;}int d;cin>>d;for(int i=0;i<d;i++){int a,b;cin>>a>>b;bad[a][b]=bad[b][a]=1;}cin>>x>>y; for(int i=1;i<=n;i++){for(int j=1;j<=n;j++){if(bad[i][j]!=1&&ma[i][j]!=INF){ma[i][j]=ma[j][i]=0; }}}Dijkstra(x);cout<<len[y]<<endl;    }return 0;}/**/




原创粉丝点击