啊啊啊学术区没人看
给Case张可能有重边有自环的带权有向图判断他们有没有负环 有输出YES 没有输出NO
输入格式:
一个数Case表示图的张数
以后每张图两个n,m表示 这张图的点数和边数
接下来m行 每行三个数 xi,yi,zi 表示一条xiyi 权值为z的边
输出格式:
Case行 第i行表示第i张图有没有负环
有输出YES 没有输出NO
#include<bits/stdc++.h>
#define F(i,a,b) for(register int i = (a);i<=(b);i++)
#define ll long long
using namespace std;
inline int read(){register int x=0,f=1;register char ch=getchar();while (ch<'0'||ch>'9'){if (ch=='-') f=-1;ch=getchar();}while (ch>='0'&&ch<='9'){x=(x<<1)+(x<<3)+(ch^48);ch=getchar();}return x*f;}
int main()
{
int T;
cin >> T;
F(ttt,1,T)
{
vector<int>g[150],w[150];
int n=read(),m=read();
F(i,1,n)
{
int u,v,W;
cin >> u >> v >> W;
g[u].push_back(v);
w[u].push_back(W);
}
bool flag=0;
F(i,1,n)
{
int dis[150],sum[150];
memset(dis,0,sizeof(dis));
memset(sum,0,sizeof(sum));
queue<int>q;
q.push(i);
while(!q.empty())
{
int u=q.front();
q.pop();
sum[u]++;
if(sum[u]==n)
{
puts("YES");
flag=1;
break;
}
F(j,0,g[u].size()-1)
{
int v=g[u][j];
if(dis[u]+w[u][j]<=dis[v])
{
dis[v]=dis[u]+w[u][j];
q.push(v);
}
}
}
if(flag==1) break;
}
if(!flag) puts("NO");
}
return 0;
}
为什么会RE啊