题解:第一种使用floyd判负环,只需要在算法过程多一个判读dp[i][i]是否为负数即可。
附上代码:
#include<iostream>
#include<cstdio>
#include<cstring>
using namespace std;
const int maxn=505;
int min(int a,int b)
{
if(a>b){
return b;
}else{
return a;
}
}
int n,m,k;
int mapp[maxn][maxn];
int floyd()
{
int f=0;
for(int k=1;k<=n;k++){
for(int i=1;i<=n;i++){
for(int j=1;j<=n;j++){
int t=mapp[i][k]+mapp[k][j];
if(t<mapp[i][j]){
mapp[i][j]=t;
}
//mapp[i][j]=min(mapp[i][j],mapp[i][k]+mapp[k][j]);
}
if(mapp[i][i]<0){
return 1;
}
}
}
return f;
}
int main()
{
int t;
scanf("%d",&t);
while(t--){
scanf("%d%d%d",&n,&m,&k);
memset(mapp,0x3f3f3f3f,sizeof(mapp));
for(int i=1;i<=n;i++){
mapp[i][i]=0;
}
int a,b,c;
for(int i=1;i<=m;i++){
scanf("%d%d%d",&a,&b,&c);
if(c<mapp[a][b]){
mapp[a][b]=mapp[b][a]=c;
}
}
for(int i=1;i<=k;i++){
scanf("%d%d%d",&a,&b,&c);
mapp[a][b]=-c;
}
int f=floyd();
if(!f){
printf("NO\n");
}else{
printf("YES\n");
}
}
return 0;
}
第二种使用spfa判负环
附上代码:
#include<iostream>
#include<cstdio>
#include<algorithm>
#include<vector>
#include<cstring>
#include<queue>
using namespace std;
const int MAXN=550;
const int inf=0x3f3f3f3f;
struct Edge{
int v,cost;
Edge(int _v,int _cost):v(_v),cost(_cost){}
};
vector<Edge>E[MAXN];
void addedge(int u,int v,int w)
{
E[u].push_back(Edge(v,w));
}
bool vis[MAXN];
int cnt[MAXN];
int dist[MAXN];
int n,m,w;
bool spfa(int start)
{
memset(vis,false,sizeof(vis));
for(int i=1;i<=n;i++){
dist[i]=inf;
}
vis[start]=true;
dist[start]=0;
queue<int>que;
while(!que.empty()){
que.pop();
}
que.push(start);
memset(cnt,0,sizeof(cnt));
cnt[start]=1;
while(!que.empty()){
int u=que.front();
que.pop();
vis[u]=false;
for(int i=0;i<E[u].size();i++){
int v=E[u][i].v;
if(dist[v]>dist[u]+E[u][i].cost){
dist[v]=dist[u]+E[u][i].cost;
if(!vis[v]){
vis[v]=true;
que.push(v);
if(++cnt[v]>n){
return false;
}
}
}
}
}
return true;
}
int main()
{
int t;
scanf("%d",&t);
while(t--){
scanf("%d%d%d",&n,&m,&w);
for(int i=1;i<=n;i++){
E[i].clear();
}
int a,b,c;
for(int i=1;i<=m;i++){
scanf("%d%d%d",&a,&b,&c);
addedge(a,b,c);
addedge(b,a,c);
}
for(int i=1;i<=w;i++){
scanf("%d%d%d",&a,&b,&c);
addedge(a,b,-c);
}
if(spfa(1)){
printf("NO\n");
}else{
printf("YES\n");
}
}
return 0;
}