记录编号 348392 评测结果 AAAAAAAAA
题目名称 道路重建 最终得分 100
用户昵称 GravatarЯ люблю тебя  是否通过 通过
代码语言 C++ 运行时间 0.004 s
提交时间 2016-11-14 09:50:59 内存使用 0.36 MiB
显示代码纯文本
#include <iostream>
#include <cstdio>
#include <cstdlib>
#include <cstring>
#include <cmath>
#include <climits>
#include <algorithm>
using namespace std;

const int maxn=100+10;
int n,m,d;
int a[maxn][maxn],f[maxn];
int s,t;

void spfa();

int main()
{
	freopen("rebuild.in","r",stdin);
	freopen("rebuild.out","w",stdout);

	cin>>n>>m;
	for (int i=1; i<=n;i++)
	for (int j=1; j<=n; j++)
		a[i][j]=INT_MAX/2;
		
	for (int k=0; k<m; k++)
	{
		int i,j,x;
		cin>>i>>j>>x;
		a[i][j]=x; a[j][i]=x;
	}
	cin>>d;
	for (int k=0; k<d; k++)
	{
		int i,j;
		cin>>i>>j;
		a[i][j]*=-1; a[j][i]*=-1;
	}
	for (int i=1; i<=n; i++)
	for (int j=1; j<=n; j++)
	{
		if (a[i][j]>0 && a[i][j]!=INT_MAX/2)
			a[i][j]=0;
		else if (a[i][j]<0)
			a[i][j]*=-1;
	}
	cin>>s>>t;
	
	spfa();
	cout<<f[t]<<endl;
	
	return 0;
}
bool used[maxn];
int q[maxn],front,tail;
void spfa()
{
	for (int i=1; i<=n; i++)
		f[i]=INT_MAX;
	f[s]=0;
	
	front=0; tail=1;
	q[tail]=s; used[s]=true;
	
	while (front!=tail)
	{
		front=(front+1)%maxn;
		int u=q[front];
		used[u]=false;
		
		for (int i=1; i<=n; i++)
		{
			if (f[u]+a[u][i]<f[i])
			{
				f[i]=f[u]+a[u][i];
				if (!used[i])
				{
					tail=(tail+1)%maxn;
					q[tail]=i; used[i]=true;
				}
			}
		}
	}
}