社区讨论

Spfa求调

P3371【模板】单源最短路径(弱化版)参与者 2已保存回复 3

讨论操作

快速查看讨论及其快照的属性,并进行相关操作。

当前回复
3 条
当前快照
1 份
快照标识符
@lo7pw5jj
此快照首次捕获于
2023/10/27 05:49
2 年前
此快照最后确认于
2023/10/27 05:49
2 年前
查看原帖
CPP

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

const int N = 500005, M = 500010;
const int inf = pow(2,31)-1;
struct Edge
{
    int to, nxt, w;
}e[M];
int cnt;
int dis[N],head[N];
int cnt1[N],vis[N]; 
int n, m, s;
queue<int> q;
void add(int u,int v,int w)
{
	e[++cnt].to = v;
	e[cnt].w = w;
	e[cnt].nxt = head[u];
	head[u] = cnt;
}
bool spfa()
{
    for(int i=0; i<=500000; i++) dis[i] = inf;
    dis[s] = 0; vis[s] = 1;
    q.push(s);
    while(!q.empty()) 
    {
    	int u = q.front(); q.pop();
    	vis[u] = 0;
    	for(int i=head[u]; i; i=e[i].nxt)
    	{
    		int v = e[i].to, w = e[i].w;
    		if(dis[v] > dis[u]+w)
    		{
    			dis[v] = dis[u]+w;
    			cnt1[v] = cnt1[u]+1;
    			if(cnt1[v] >= n) return false;
    			if(vis[v] == 0)
    			{
    				q.push(v); vis[v] = 1;
				}
			}
		}
    }
    return 1;
}

signed main()
{
	ios::sync_with_stdio(false);
    cin >> n >> m >> s;
    for(int i=1; i<=m; i++)
    {
        int a, b, w;
        scanf("%d%d%d", &a, &b, &w);
        add(a,b,w);	
    }
    bool flag = spfa();
    for(int i=1; i<=n; i++) cout<<dis[i]<<" ";
    return 0;
}

回复

3 条回复,欢迎继续交流。

正在加载回复...