acyclic:无环的
dijistra判最小环。
#include <iostream>
#include <cstdio>
#include <algorithm>
#include <cstring>
#include <cmath>
#include <vector>
#include <queue>
#define INF 0x3f3f3f3f
using namespace std;
typedef pair<int,int> PII;
const int N = 2020, M = 5010;
int idx,h[N],e[M],ne[M],w[M];
int dist[N];
bool st[N];
int n,m,c;
void add(int a,int b,int c){
e[idx] = b, w[idx] = c, ne[idx] = h[a], h[a] = idx ++;
}
priority_queue<PII,vector<PII>,greater<PII> > q;
bool dijistra(int start){
memset(dist,0x3f,sizeof dist);
memset(st,0,sizeof st);
dist[start] = 0;
// priority_queue<PII,vector<PII>,greater<PII> > p;
q.push({
0,start});
while(!q.empty()){
auto t = q.top();
q.pop();
if(st[t.second]) continue;
st[t.second] = 1;
int u = t.second;
for(int i=h[u];i!=-1;i=ne[i]){
int j = e[i];
if(j==start){
if(dist[u] + w[i] <= c){
return true;
}
}
if(dist[u] + w[i] < dist[j]){
dist[j] = dist[u] + w[i];
q.push({
dist[j],j});
}
}
}
return false;
}
int main()
{
memset(h,-1,sizeof h);
scanf("%d%d%d",&n,&m,&c);
int res = 0;
for(int i=1;i<=m;i++){
int a,b,w;
scanf("%d%d%d",&a,&b,&w);
add(a,b,w);
if(w<=c) res = 1;
}
if(!res) printf("0");
else{
for(int i=1;i<=n;i++){
if(dijistra(i)){
res = 2;
break;
}
}
printf("%d",res);
}
return 0;
}