46分 最短路求调 ,玄关
查看原帖
46分 最短路求调 ,玄关
575363
revolutionary_oier楼主2024/7/22 10:35
#include<bits/stdc++.h>
#define int long long 
using namespace std;

const int maxn=5e4+10;
const int inf=1e18;
int n,m,c;
int head[maxn],dis[maxn],cnt[maxn];
bool in[maxn];
struct node{
    int v,nxt,w;
}e[maxn<<2];
inline void add(int u,int v,int w){
    e[++c].w=w;
    e[c].v=v;
    e[c].nxt=head[u];
    head[u]=c;
}
inline void ipt(){
    scanf("%lld%lld",&n,&m);
    for(int i=1;i<=m;i++){
        int u,v,w;
        scanf("%lld%lld%lld",&u,&v,&w);
        add(v,u,w);
    }
    for(int i=1;i<=n;i++)add(0,i,0);
}
inline bool spfa( int s ){
	for ( int i = 0; i <= n; i++ )
		dis[i] = inf;
	queue<int> q;
	dis[s]=0;
	in[s]= true;     
	cnt[s]++;             
	q.push( s );
	while (!q.empty())
	{
		int u = q.front(); q.pop();
		in[u] = false;
		for ( int j = head[u]; j; j =e[j].nxt )
		{
			int v = e[j].v, w = e[j].w;
			if ( dis[v] > dis[u] + w )
				dis[v] = dis[u] + w;
			if ( in[v] )
				continue;
			q.push( v );
			in[v] = true;
			cnt[v]++;
			if ( cnt[v] > n+1 )return false;
		}
	}
	return true;
}
signed main(){
    ipt();
    if(!spfa(0)){
        printf("NO\n");
        return 0;
    }
    for(int i=1;i<=n;i++)printf("%lld ",dis[i]);
    return 0;
}
2024/7/22 10:35
加载中...