60pts 求助 玄关
查看原帖
60pts 求助 玄关
808180
HDS_Acenaphthylene楼主2024/5/10 15:12
#include<bits/stdc++.h>
using namespace std;
int n, m, dis[2005], cnt[2005], vi[2005];
vector<pair<int, int> >g[2005];
priority_queue<pair<int,int>,vector<pair<int, int> >,greater<pair<int,int> > > q;
#define inf 0x3f3f3f3f
void dijk() {
	dis[1] = 0;
	cnt[1] = 1;
	q.push({0, 1});
	while(!q.empty()) {
		pair<int, int> p = q.top();
		q.pop();
		int w = p.first, u = p.second;
		if(vi[u]) continue;
		vi[u] = 1;
		for(auto [v, $] : g[u])
			if(w + $ < dis[v]){
			    dis[v] = w + $, cnt[v] = cnt[u];
			    if(!vi[v])
			        q.push({w + $, v});
			}
			else if(w + $ == dis[v])
				cnt[v] += cnt[u];
	}
}
signed main() {
	cin >> n >> m;
	for(int i = 1;i <= m;i ++) {
		int u, v, w;
		cin >> u >> v >> w;
		g[u].push_back({v, w});
	}
	for(int u = 1;u <= n;u ++) {
		sort(g[u].begin(), g[u].end());
		for(int j = 0;j + 1 < g[u].size();j ++)
			if(g[u][j].first == g[u][j + 1].first)
				g[u][j].second = min(g[u][j].second, g[u][j + 1].second),
				swap(g[u][j + 1], g[u][g[u].size() - 1]),
				g[u].pop_back();
	}
	memset(dis, inf, sizeof dis);
	dijk();
	if(dis[n] == inf) cout << "No answer";
	else cout << dis[n] << " " << cnt[n];
}
2024/5/10 15:12
加载中...