比赛 20160923 评测结果 AAAAAAAAA
题目名称 道路重建 最终得分 100
用户昵称 iortheir 运行时间 0.025 s
代码语言 C++ 内存使用 0.31 MiB
提交时间 2016-09-23 20:44:16
显示代码纯文本
#include<iostream>
#include<cstdio>
#include<algorithm>

using namespace std;

const int maxn=100+10;

const int INF=0x7ffffff;
//const int INF=0x7f;

int main()
{
	freopen("rebuild.in","r",stdin);
	freopen("rebuild.out","w",stdout);
	int n;
	int m;
	int A[maxn][maxn];
	int B[maxn][maxn];
	int d;
	int a;
	int b;
	int w;
	int ra;
	int rb;
	int x;
	int y;
	scanf("%d%d",&n,&m);
	for(int i=1;i<=n;++i)
	{
		for(int j=1;j<=n;++j)
		{
			if(i!=j)
			{
				A[i][j]=B[i][j]=INF;
				A[j][i]=B[j][i]=INF;
			}
		}
	}
	for(int i=1;i<=m;++i)
	{
		scanf("%d%d%d",&a,&b,&w);
		A[a][b]=A[b][a]=w;
	}
	scanf("%d",&d);
	for(int i=1;i<=d;++i)
	{
		scanf("%d%d",&ra,&rb);
		B[ra][rb]=B[rb][ra]=A[ra][rb];
	}
	scanf("%d%d",&x,&y);
	for(int i=1;i<=n;++i)
	{
		for(int j=1;j<=n;++j)
		{
			if(B[i][j]==INF&&A[i][j]<INF)//建立B图 跑一遍最短路即可--
			{
				B[i][j]=0;
			}
		}
	}
	for(int k=1;k<=n;++k)
	{
		for(int i=1;i<=n;++i)
		{
			for(int j=1;j<=n;++j)
			{
				if(i!=j&&j!=k&&k!=i)
				{
					B[i][j]=min(B[i][j],B[i][k]+B[k][j]);
				}
			}
		}
	}
	cout<<B[x][y];
	return 0;
}