dij次短路求调
查看原帖
dij次短路求调
794701
wo_hen_la楼主2024/9/15 17:34

WA on#3 and Hack 为什么改成spfa就对

#include <bits/stdc++.h>
using namespace std;
#define int long long
#define pi make_pair
#define pb push_back
const int N=5005;

int n,m;
vector<pair<int,int> >e[N];
bool vis[N];
int dis[N][2];
priority_queue<pair<int,int>,vector<pair<int,int> >,greater<pair<int,int> > > r;
void dij()
{
	for(int i=1;i<n;i++) dis[i][0]=dis[i][1]=1e18;
	dis[n][1]=1e18;
	r.push(pi(0,n));
	while(!r.empty()){
		int u=r.top().second;r.pop();
		if(vis[u]) continue;
		vis[u]=1;
		for(auto vv:e[u]){
			int v=vv.first,w=vv.second;
			bool f=0;
			if(dis[u][0]+w<dis[v][0]){
				dis[v][1]=dis[v][0];
				dis[v][0]=dis[u][0]+w;
				f=1;
			}
			if(dis[u][0]+w<dis[v][1] && dis[u][0]+w>dis[v][0]) dis[v][1]=dis[u][0]+w,f=1;
			if(dis[u][1]+w<dis[v][1]) dis[v][1]=dis[u][1]+w,f=1;
			if(f) r.push(pi(dis[v][0],v));
		}
	}
	cout<<dis[1][1];
}
signed main()
{
	ios::sync_with_stdio(0);cin.tie(0);cout.tie(0);
	cin>>n>>m;
	for(int i=1,u,v,w;i<=m;i++){
		cin>>u>>v>>w;
		e[u].pb({v,w});e[v].pb({u,w});
	}
	dij();
	return 0;
}
2024/9/15 17:34
加载中...