#include<bits/stdc++.h>
using namespace std;
#define int long long
using PII = pair<int, int> ;
const int N = 1e6 + 10;
const int inf = 1e12;
vector<PII> e[N];
int n, m, s;
int d[N];
void Dijkstra(int s)
{
for(int i = 0; i <= n; i++){
d[i] = inf;
}
priority_queue<PII, vector<PII>, greater<PII>> heap;
heap.emplace(0, s);
d[s] = 0;
while(heap.size()) {
auto x = heap.top();
int dis = x.first, u = x.second;
heap.pop();
if(d[u] < dis) continue;
for(auto ed : e[u]){
int v = ed.first, w = ed.second;
if(dis + w < d[v]){
d[v] = d[u] + w;
heap.emplace(d[v], v);
}
}
}
if(d[n]==inf)
{
cout<<"can't arrive!";
return;
}
int f=1;
for(int i=1;i<=m;i++)
{
int v = e[i].first;
int w = e[i].second;
if(d[i] + w < d[v]){
f=0;
}
}
if(f==0)
{
cout<<"circle";
return ;
}
cout<<d[n];
}
signed main(){
cin >> n >> m;
for(int i = 1; i <= m; i++) {
int u, v, w;
cin >> u >> v >> w;
e[u].push_back({v, w});
e[v].push_back({u, w});
}
Dijkstra(1);
return 0;
}
给定一个有向图,求1到n的最短路径。
可以判断图中是否有负环。
输入 第一行两个整数n和m,表示点数和边数。
接下来m行,每行3个整数,表示一条有向边。
输出 如果图中有负环,输出circle
如果没有负环,但是从1无法到达n,输出 can't arrive!
否则输出 1到n的最短距离