如题,在学习过其它大佬文字写的博客之后大为震撼,决定自己不看任何代码的情况下自己思考然后写一下这个模板,但是结果还是差强人意。
就是说我想的是建图之后,入度为0的点没有约束条件,因此设置为0以它们为源点分别spfa,然后再判断一下负环为啥不行呢,就是大部分情况下负环都很难判出来,就想知道一下原因。
#include<bits/stdc++.h>
#define maxn 5005
using namespace std;
struct eee{
int next;
int to;
int w;
}edge[maxn<<2];
int root[maxn],degree[maxn],dis[maxn],e_cnt[maxn],in_que[maxn],cnt,n,m;
void add(int x,int y,int w){
edge[++cnt].next=root[x];
edge[cnt].to=y;
edge[cnt].w=w;
degree[y]++;
root[x]=cnt;
}
int spfa(){
memset(dis,0x3f,sizeof(dis));
queue<int>q;
for(int i=1;i<=n;i++){
if(!degree[i]){
q.push(i);
dis[i]=0;
e_cnt[i]=0;
in_que[i]=1;
}
}
if(q.empty()){
q.push(1);
dis[1]=0;
e_cnt[1]=0;
in_que[1]=1;
}
while(q.size()){
int u=q.front();
q.pop();
in_que[u]=0;
for(int i=root[u];i;i=edge[i].next){
int v=edge[i].to,w=edge[i].w;
if(dis[v]>dis[u]+w){
dis[v]=dis[u]+w;
e_cnt[v]=e_cnt[u]+1;
if(e_cnt[v]>n){
return false;
}
if(!in_que[v]){
in_que[v]=1;
q.push(v);
}
}
}
}
return true;
}
void sync(){
ios::sync_with_stdio(0);
cin.tie(0);
cout.tie(0);
}
int main(){
sync();
cin>>n>>m;
while(m--){
int x,y,w;
cin>>x>>y>>w;
add(x,y,-w);
}
if(spfa()){
for(int i=1;i<=n;i++){
printf("%d ",dis[i]);
}
putchar(10);
}
else{
printf("NO\n");
}
return 0;
}