Reconstruction of roads
解题思路
b f s bfs bfs ,损坏的道路负边权,未损坏赋 0 0 0 。(甚至听说 d f s dfs dfs 都能跑过)
code
#include<iostream>
#include<cstring>
#include<cstdio>
using namespace std;
int n,m,d;
int st,ed;
int v[110];
int f[100010];
int minn[110];
int a[110][110];
int flg[110][110];
void bfs()
{
f[1]=st;
memset(minn,0x3f3f3f3f,sizeof(minn));
minn[st]=0;
int hd=0,tl=1;
while(hd<tl)
{
hd++;
int x=f[hd];
for(int i=1;i<=n;i++)
{
if(minn[x]+a[x][i]<minn[i])
{
minn[i]=minn[x]+a[x][i];
if(!v[i])
v[i]=1,f[++tl]=i;
}
}
v[x]=0;
}
}
int main()
{
freopen("road.in","r",stdin);
freopen("road.out","w",stdout);
cin>>n>>m;
memset(a,0x3f3f3f3f,sizeof(a));
for(int i=1;i<=m;i++)
{
int x,y,z;
scanf("%d%d%d",&x,&y,&z);
a[x][y]=a[y][x]=z;
}
cin>>d;
for(int i=1;i<=d;i++)
{
int x,y;
scanf("%d%d",&x,&y);
flg[x][y]=flg[y][x]=1;
}
for(int i=1;i<=n;i++)
for(int j=1;j<=n;j++)
if(!flg[i][j]&&a[i][j]!=0x3f3f3f3f)
a[i][j]=0;
cin>>st>>ed;
bfs();
cout<<minn[ed]<<endl;
}