2014/12/11
嚇我一跳,還以爲連最短路都不會敲了。
debug發現輸入弄錯了
:
for(int i =0 ;i < m; i++)
{
scanf("%d%d%d",&a,&b,&c);
s[a][b] = Min(c,s[a][b]);
s[b][a] = Min(c,s[b][a]);
}
這個寫錯寫成
for(int i =0 ;i < m; i++)
scanf("%d%d%d",&a,&b,&c);
s[a][b] = Min(c,s[a][b]);
s[b][a] = Min(c,s[b][a]);
也是累,題目不難,對於時間不太有把握就不用暴力的了。根據蟲洞的數量去dij, 有蟲洞 a->b = w存在,那你就去求下,b->a的最短路長度 S ,然後看S-W 是否小於0就好。
#include<stdio.h>
#include<string.h>
#define inf 50000000
using namespace std;
int s[600][600];
int dp[600];
int vis[600];
struct edge{
int l,r,t;
}ss[500];
int Min(int a,int b)
{
return a<b?a:b;
}
int main()
{
int tot;
while(~scanf("%d",&tot))
{
int n, m, w;
int a, b , c;
while(tot--)
{
for(int i = 0 ;i < 600; i++)
{
for(int j = 0;j < 600; j++)
s[i][j] = inf;
s[i][i] = 0;
}
scanf("%d%d%d",&n,&m,&w);
for(int i =0 ;i < m; i++)
{
scanf("%d%d%d",&a,&b,&c);
s[a][b] = Min(c,s[a][b]);
s[b][a] = Min(c,s[b][a]);
}
for(int i = 0;i < w; i++)
{
scanf("%d%d%d",&ss[i].l,&ss[i].r,&ss[i].t);
s[ss[i].l][ss[i].r] = Min(s[ss[i].l][ss[i].r],-ss[i].t);
}
int temp = 0;
for(int k = 0;k < w; k++)
{
for(int i= 0 ;i < 600; i++)
dp[i] = inf,vis[i] =0;
int ed = ss[k].l;
int bn = ss[k].r;
dp[bn] = 0;
vis[bn] = 1;
s[ed][bn] = inf;
int pos = bn;
for(int i = 1;i <= n; i++)
{
for(int j = 1;j <= n; j++)
{
if(!vis[j])
dp[j] = Min(dp[pos]+s[pos][j],dp[j]);
}
int mmin = inf;
for(int t = 1;t <= n; ++t)
{
if(!vis[t] && dp[t] < mmin)
{
mmin=dp[t];
pos=t;
}
}
vis[pos]=1;
}
if(dp[ed]-ss[k].t < 0)
{
temp = 1;
break;
}
s[ed][bn] = -ss[k].t;
}
if(temp)
{
printf("YES\n");
}
else printf("NO\n");
}
}
return 0;
}