记录编号 |
27816 |
评测结果 |
AAAAAAAAA |
题目名称 |
道路重建 |
最终得分 |
100 |
用户昵称 |
belong.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;
}