比赛 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;
}