最短路问题
m条路径 从si到ei需要ti时间
w跳虫洞 从si到ei回到ti时间前 即权值为负
求是否能回到从前即从0计时 回到0之前的时间
用bellman-ford算法 求是否出现负环 即无限循环无限回到之前的时间
#include<cstdio>
using namespace std;
#define M 5505
int n,m,w;
struct Node
{
int u,v,t;
}a[M];
double dis[M];
void add(int num,int u,int v,int t)
{
a[num].u=u;
a[num].v=v;
a[num].t=t;
}
bool cal()
{
int i;
int t=n;
for(i=1;i<=n;i++)
{
dis[i]=10001;
}
dis[1]=0;
while(t--)
{
bool bf=false;
for(i=0;i<m*2+w;i++)
{
if(dis[a[i].v]>(dis[a[i].u]+a[i].t) )
{
dis[a[i].v]=(dis[a[i].u]+a[i].t);
bf=true;
}
}
if(!bf)
{
break;
}
}
bool bans=false;
if(t<0)
{
bans=true;
}
return bans;
}
int main()
{
int T;
scanf("%d",&T);
while(T--)
{
scanf("%d%d%d",&n,&m,&w);
int i,u,v,t;
for(i=0;i<m;i++)
{
scanf("%d%d%d",&u,&v,&t);
add(i,u,v,t);
add(i+m,v,u,t);
}
for(i=m*2;i<m*2+w;i++)
{
scanf("%d%d%d",&u,&v,&t);
add(i,u,v,-t);
}
if(cal())
{
puts("YES");
}
else
{
puts("NO");
}
}
return 0;
}

被折叠的 条评论
为什么被折叠?



