比赛 |
20110727 |
评测结果 |
AAAAAAAAA |
题目名称 |
道路重建 |
最终得分 |
100 |
用户昵称 |
PurpleShadow |
运行时间 |
0.000 s |
代码语言 |
C++ |
内存使用 |
0.00 MiB |
提交时间 |
2011-07-27 09:59:09 |
显示代码纯文本
#include <cstdio>
#include <cstring>
#include <algorithm>
using namespace std;
const int N=101,inf=0x3f3f3f3f;
int n,m,x[N][N],g[N][N];
int S,T;
void init()
{
scanf("%d%d",&n,&m);
memset(x,0x3f,sizeof(x));
for (int i=1;i<=n;++i) x[i][i]=0;
memcpy(g,x,sizeof(x));
int a,b,w;
for (int i=1;i<=m;++i)
{
scanf("%d%d%d",&a,&b,&w);
x[a][b]=x[b][a]=w;
g[a][b]=g[b][a]=0;
}
int t;
scanf("%d",&t);
for (int i=1;i<=t;++i)
{
scanf("%d%d",&a,&b);
g[a][b]=g[b][a]=x[a][b];
}
scanf("%d%d",&S,&T);
}
bool flag[N];
int dis[N];
void slove()
{
memset(flag,0,sizeof(flag));
memset(dis,0x3f,sizeof(dis));
dis[S]=0;
int i,j,m;
for (;;)
{
m=inf;j=0;
for (i=1;i<=n;++i)
if (!flag[i]&&dis[i]<m)
{
m=dis[i];
j=i;
}
if (!j) break;
flag[j]=1;
for (i=1;i<=n;++i)
if (!flag[i]) dis[i]=min(dis[i],dis[j]+g[j][i]);
}
printf("%d\n",dis[T]);
}
int main()
{
freopen("rebuild.in","r",stdin);
freopen("rebuild.out","w",stdout);
init();
slove();
return 0;
}