描述

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的更多相关文章

  1. POJ 3204 Ikki's Story I - Road Reconstruction

    Ikki's Story I - Road Reconstruction Time Limit: 2000MS   Memory Limit: 131072K Total Submissions: 7 ...

  2. POJ3204 Ikki's Story I - Road Reconstruction

    Ikki's Story I - Road Reconstruction Time Limit: 2000MS   Memory Limit: 131072K Total Submissions: 7 ...

  3. HDU 3080 The plan of city rebuild(除点最小生成树)

    题意  一个城市原来有l个村庄 e1条道路  又添加了n个村庄 e2条道路  后来后销毁了m个村庄  与m相连的道路也销毁了  求使全部未销毁村庄相互连通最小花费  不能连通输出what a pity ...

  4. HDU 3080 The plan of city rebuild(prim和kruskal)

    The plan of city rebuild Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java ...

  5. Visual Studio 中 Build 和 Rebuild 的区别

    因为之前写的程序比较小,编译起来比较快,所以一直都没有太在意 Build 和 Rebuild 之间的区别,后来发现两个还是有很大不同. Build 只针对在上次编译之后更改过的文件进行编译,在项目比较 ...

  6. 解决 node-gyp rebuild 卡住 的问题

    node-gyp在编译前会首先尝试下载node的headers文件,像这样: gyp http GET https://nodejs.org/download/release/v6.8.1/node- ...

  7. AndroidStudio中make Project、clean Project、Rebuild Project的区别

    1.Make Project:编译Project下所有Module,一般是自上次编译后Project下有更新的文件,不生成apk. 2.Make Selected Modules:编译指定的Modul ...

  8. 【Codeforces 738C】Road to Cinema

    http://codeforces.com/contest/738/problem/C Vasya is currently at a car rental service, and he wants ...

  9. Rebuild Instance 操作详解 - 每天5分钟玩转 OpenStack(37)

    上一节我们讨论了 snapshot,snapshot 的一个重要作用是对 instance 做备份. 如果 instance 损坏了,可以通过 snapshot 恢复,这个恢复的操作就是 Rebuil ...

随机推荐

  1. Javascript脚本 : eval()函数

    Javascript 中 eval(X)函数 是将参数 当做语句来执行 var number1='1+2'; alert(number1); 输出为 '12': var number2=eval('1 ...

  2. Delphi XE8中Android开发有用的资源!

    一,FireMonkey Component Library在XE8帮助(topics.chm)中的位置:FireMonkey Component Library,展示了FireMonkey控件在VC ...

  3. Codeforces Round #546 (Div. 2)D(贪心,思维,SET,VECTOR,模拟)

    #include<bits/stdc++.h>using namespace std;int a[300007],b[500007],c[500007];set<int>st[ ...

  4. 关于spring xml文件中的xmlns,xsi:schemaLocation

    链接:https://blog.csdn.net/u010571844/article/details/50767151 使用spring也有一段时间了,配置文件也见了不少了,但是发现配置文件的bea ...

  5. 通过ssh访问NAT网络模式下的虚拟机Linux

    链接:https://blog.csdn.net/jiuduan2009/article/details/51737004 https://blog.csdn.net/disalone201107/a ...

  6. myeclipse2014 安装maven3.3.9和maven配置本地仓库 及错误修改

    结合网上的知识梳理以及自己安装的经验 myeclipse2014 安装maven3.3.9和maven配置本地仓库  及犯的错误修改  成功搞定maven 1,安装 Maven 之前要求先确定你的 J ...

  7. SDUT OJ 图结构练习——最短路径 ( Floyed 算法 AND Dijkstra算法)

    图结构练习——最短路径 Time Limit: 1000 ms            Memory Limit: 65536 KiB Submit Statistic Discuss Problem ...

  8. ubuntu 18.04 通过联网方式安装wine

    ubuntu 18.04 通过联网方式安装wine 1.如果是64位机器,先开启允许32位架构程序运行 sudo dpkg --add-architecture i386 2.添加元wine源码安装仓 ...

  9. python wraps装饰器

    这是一个很有用的装饰器.看过前一篇反射的朋友应该知道,函数是有几个特殊属性比如函数名,在被装饰后,上例中的函数名foo会变成包装函数的名字 wrapper,如果你希望使用反射,可能会导致意外的结果.这 ...

  10. there is already 'RtController' bean method 项目报错

    今天开发项目时候发现项目报错启动的时候,也没有具体指的是哪一行报错,其实很简单的知道,首先看下报错信息: there is already 'RtController' bean method pub ...