记录编号 | 27816 | 评测结果 | AAAAAAAAA | ||
---|---|---|---|---|---|
题目名称 | 道路重建 | 最终得分 | 100 | ||
用户昵称 | 是否通过 | 通过 | |||
代码语言 | 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; }