记录编号 27816 评测结果 AAAAAAAAA
题目名称 道路重建 最终得分 100
用户昵称 Gravatarbelong.zmx 是否通过 通过
代码语言 C++ 运行时间 0.004 s
提交时间 2011-10-02 17:34:39 内存使用 0.34 MiB
显示代码纯文本
#include <iostream>
#include <cstdlib>
#include <cstdio>

using namespace std;

const int oo=99999999;
int i,j,n,m,way[101][101],x,y,z,d,s,e;
int f[101],q[10001];
bool t[101];

void spfa()
{
	int head=1,tail=1,j;
	t[s]=true;q[head]=s;f[s]=0;
	do
	{
		for (j=1;j<=n;j++)
			if (f[j]>f[q[head]]+way[q[head]][j])
			{
				f[j]=f[q[head]]+way[q[head]][j];
				if (!t[j])
				{
					tail++;q[tail]=j;t[j]=true;
				}
			}
		t[q[head]]=false;head++;
	}while(head<=tail);
}

int main()
{
	freopen("rebuild.in","r",stdin);
	freopen("rebuild.out","w",stdout);
	scanf("%d\n%d\n",&n,&m);
	for (i=1;i<=n;i++)
		for (j=1;j<=n;j++) way[i][j]=oo;
	for (i=1;i<=n;i++) f[i]=oo;
	for (i=1;i<=m;i++)
	{
		scanf("%d%d%d\n",&x,&y,&z);
		way[x][y]=z;way[y][x]=z;
	}
	scanf("%d\n",&d);
	for (i=1;i<=d;i++)
	{
		scanf("%d%d\n",&x,&y);
		way[x][y]*=-1;way[y][x]*=-1;
	}
	for (i=1;i<=n;i++)
		for (j=1;j<=n;j++)
			if (way[i][j]>=0 && way[i][j]!=oo) way[i][j]=0;
			else if (way[i][j]<0) way[i][j]*=-1;
	scanf("%d%d",&s,&e);
	spfa();
	printf("%d\n",f[e]);
	return 0;
}