比赛 |
20160923 |
评测结果 |
AAAAAAAAA |
题目名称 |
道路重建 |
最终得分 |
100 |
用户昵称 |
Ostmbh |
运行时间 |
0.013 s |
代码语言 |
C++ |
内存使用 |
0.39 MiB |
提交时间 |
2016-09-23 20:59:19 |
显示代码纯文本
#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
using namespace std;
int dis[101];
int vis[101]={0};
int w[101][101];
int r[101][101]={0};
int main(){
freopen("rebuild.in","r",stdin);
freopen("rebuild.out","w",stdout);
int n,m;
scanf("%d %d",&n,&m);
int x,y,z;
memset(dis,127/2,sizeof(dis));
memset(w,127/2,sizeof(w));
for(int i=1;i<=m;i++){
cin>>x>>y>>z;
w[x][y]=w[y][x]=z;
}
int kd=dis[0];
int k;
cin>>k;
for(int i=1;i<=k;i++){
cin>>x>>y;
r[x][y]=r[y][x]=w[x][y];
}
for(int i=1;i<=n;i++)
for(int j=1;j<=n;j++)
if(w[i][j]==kd)
r[i][j]=r[j][i]=kd;
int st,en;
cin>>st>>en;
dis[st]=0;
for(int i=1;i<=n;i++){
int minn=0x7fffffff,u;
for(int j=1;j<=n;j++)
if(dis[j]<minn&&!vis[j]){
minn=dis[j];
u=j;
}
vis[u]=1;
for(int j=1;j<=n;j++){
if(dis[j]>dis[u]+r[u][j]&&!vis[j])
dis[j]=dis[u]+r[u][j];
}
}
cout<<dis[en]<<endl;
/*for(int i=1;i<=n;i++){
for(int j=1;j<=n;j++)
cout<<w[i][j]<<' ';
cout<<endl;
}
for(int i=1;i<=n;i++){
for(int j=1;j<=n;j++)
cout<<r[i][j]<<' ';
cout<<endl;
}*/
return 0;
}