1 条题解
-
0
#include<bits/stdc++.h> #define Enter puts("") #define Space putchar(' ') using namespace std; typedef long long ll; typedef double Db; inline ll Read() { ll Ans = 0; char Ch = getchar() , Las = ' '; while(!isdigit(Ch)) { Las = Ch; Ch = getchar(); } while(isdigit(Ch)) { Ans = (Ans << 3) + (Ans << 1) + Ch - '0'; Ch = getchar(); } if(Las == '-') Ans = -Ans; return Ans; } inline void Write(ll x) { if(x < 0) { x = -x; putchar('-'); } if(x >= 10) Write(x / 10); putchar(x % 10 + '0'); } const int N = 1000000; int n , m; int Count[N] , Dis[N] , Head[N]; int Total = 0; bool Visit[N] , t; queue <int> Q; struct Edge{ int Dis; int Next; int To; }E[2 * N]; inline void Add_Edge(int u , int v , int w) { E[++Total].Dis = w; E[Total].To = v; E[Total].Next = Head[u]; Head[u] = Total; } inline bool SPFA() { for(int i = 0; i <= n; i++) { Visit[i] = 0; Dis[i] = 1e6; } Visit[0] = 1 , t = 0 , Dis[0] = 0; Q.push(0); while(!Q.empty()) { int u = Q.front(); Q.pop(); Visit[u] = 0; for(int i = Head[u]; i;i = E[i].Next) { int v = E[i].To , w = E[i].Dis; if(Dis[v] > Dis[u] + w) { Dis[v] = Dis[u] + w; if(Count[v] >= n) return false; if(!Visit[v]) Visit[v] = 1 , Count[v]++ , Q.push(v); } } } return true; } int main() { n = Read() , m = Read(); for(int i = 1; i <= m; i++) { int u = Read() , v = Read() , w = Read(); Add_Edge(v , u , w); } for(int i = 1; i <= n; i++) Add_Edge(0 , i , 0); if(SPFA() == false) puts("NO"); else for(int i = 1; i <= n; i++) Write(Dis[i]) , Space; return 0; }
- 1
信息
- ID
- 4877
- 时间
- 1000ms
- 内存
- 128MiB
- 难度
- 4
- 标签
- 递交数
- 10
- 已通过
- 4
- 上传者