求助
查看原帖
求助
930686
Forge_Unique楼主2024/10/18 22:59
#include<map>
#include<queue>
#include<stack>
#include<cmath>
#include<vector>
#include<cstdio>
#include<cstring>
#include<iostream>
#include<algorithm>
#define _ 0
#define I using
#define AK namespace
#define IOI std
#define int long long
#define pii pair <int,int>
#define fx first
#define fy second
I AK IOI;
const int N = 1e4 + 10;
int n,m,u[N],v[N],w[N],ans,d[N];
int h[N],ver[N],e[N],ne[N],idx;
bool st[N];
void add(int u,int v,int w){
	idx++,ver[idx] = v,e[idx] = w,ne[idx] = h[u],h[u] = idx;
}
int dij(int s,int t){
	priority_queue <pii,vector<pii>,greater<pii> > heap;
	heap.push({0,s});
	memset(d,0x3f,sizeof(d));
	d[s] = 0;
	memset(st,false,sizeof(st));
	while(heap.size()){
		pii T = heap.top();
		heap.pop();
		int x = T.fy;
		if(st[x]){
			continue;
		}
		st[x] = true;
		for(int i = h[x];i != -1;i = ne[i]){
			int j = ver[i];
			if(x + e[i] < d[j]){
				d[j] = x + e[i];
				heap.push({d[j],j});
			}
		}
	}
	return d[t];
}
signed main(){
	ios::sync_with_stdio(false);
	cin.tie(0),cout.tie(0);
	cin >> n >> m;
	for(int i = 1;i <= m;i++){
		cin >> u[i] >> v[i] >> w[i];
	}
	for(int k = 1;k <= m;k++){
		memset(h,-1,sizeof(h));
		idx = 0;
		for(int i = 1;i <= m;i++){
			if(i == k){
				add(u[i],v[i],w[i] * 2),add(v[i],u[i],w[i] * 2);
			} else {
				add(u[i],v[i],w[i]),add(v[i],u[i],w[i]);
			}
		}
		int h = dij(1,n);
		ans = max(ans,h);
	}
	memset(h,-1,sizeof(h));
	idx = 0;
	for(int i = 1;i <= m;i++){
		add(u[i],v[i],w[i]),add(v[i],u[i],w[i]);
	}
	cout << ans - dij(1,n);
	return ~~(0^_^0);
}
2024/10/18 22:59
加载中...