求助..
  • 板块灌水区
  • 楼主alvis
  • 当前回复3
  • 已保存回复3
  • 发布时间2021/4/25 20:24
  • 上次更新2023/11/5 00:07:53
查看原帖
求助..
195388
alvis楼主2021/4/25 20:24

我是憨批。

SPFA求负环死活调不出来。


#include <bits/stdc++.h>
using namespace std;

int n, m, idx;
struct node{
	int e, ne, w;
}g[100010];
int h[100010], dist[100010], cnt[100010];
//当前队列中有哪些点
bool st[100010];

bool if_fh = false;

void add(int x, int y, int z){
	g[idx].e = y;
	g[idx].w = z;
	g[idx].ne = h[x];
	h[x] = idx++;
}

int spfa(){
	memset(dist, 0x3f3f3f3f, sizeof dist);
	queue<int> q;
	//把所有点作为起点
	for(int i = 1;i <= n;i ++){
		st[i] = true;
		q.push(i);
	} 
	
	while(!q.empty()){
		int t = q.front();
		q.pop();
		
		st[t] = false ;
		//SPFA
		for(int i=h[t];i != -1;i = g[i].ne){
			int j = g[i].e;
			if(dist[j] > dist[t] + g[i].w){
				cnt[j] = cnt[t] + 1;
				dist[j] = dist[t] + g[i].w;
				cout<<i<<" ";
				if(cnt[j] >= n)if_fh = true;
				
				if(!st[j]){
					q.push(j);
					st[j] = true;
				}
			}
		}
	}
	
	if(dist[n] == 0x3f3f3f3f) return -1;
	return dist[n];
}

int main(){
	memset(h, -1, sizeof h);
	cin >> n >> m;
	for(int i = 1;i <= m;i ++){
		int x, y, z;
		cin >> x >> y >> z;
		add(x, y, z);
	}
	
	int t = spfa();
	cout << t << endl;
	if(if_fh) cout << "Yes";
	else cout << "No";
return 0;
}

但是把求负环注释掉就可以了

2021/4/25 20:24
加载中...