站外题求助
  • 板块题目总版
  • 楼主SX114514
  • 当前回复0
  • 已保存回复0
  • 发布时间2024/7/8 16:33
  • 上次更新2024/7/8 17:33:04
查看原帖
站外题求助
745507
SX114514楼主2024/7/8 16:33
#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的最短距离

2024/7/8 16:33
加载中...