次短路板子50分求助!
查看原帖
次短路板子50分求助!
546681
lcbridgeAK CSP-S楼主2023/9/20 22:03
#include <bits/stdc++.h>
#define int long long
using namespace std;
const int M=1e5+5;
const int N=5e3+5;
const int mod=1e9+7; 
const int INF=0x3f3f3f3f;
inline int read(){
	char ch=getchar();
	int f=1,x=0;
	while(ch<'0'||ch>'9'){
		if(ch=='-')f=-1;
		ch=getchar();
	}
	while(ch>='0'&&ch<='9'){
		x=x*10+(ch-'0');
		ch=getchar();
	}
	return f*x;
}
inline void write(int x){
	if(x<0){
		putchar('-');
		x=-x;
	}
	if(x>9)write(x/10);
	putchar(x%10+'0');
	return ;
}
int n,m;
struct edge{
	int to,w;
};
vector <edge> G[M];
int dis[N][2],vis[N];
void dijkstra(int x){
	priority_queue<pair<int,int>,vector<pair<int,int> >,greater<pair<int,int> > > q;
	q.push({0,x});
	for(int i=1;i<=n;i++)dis[i][0]=dis[i][1]=INF;
	dis[x][0]=0;
	while(!q.empty()){
		int u=q.top().second;q.pop();
		if(vis[u])continue;
		vis[u]=1; 
		if(dis[u][0]>dis[u][1])continue;
		for(int i=0;i<G[u].size();i++){
			int v=G[u][i].to,w=G[u][i].w;
			int nl=w+dis[u][0];
			if(nl<dis[v][0]){
				dis[v][1]=dis[v][0],dis[v][0]=nl;
				q.push(make_pair(dis[v][0],v));
			}
			else if(nl<dis[v][1]&&nl>dis[v][0]){
				dis[v][1]=nl;
				q.push(make_pair(dis[v][1],v));
			}
		}
	} 
}
signed main(){
	n=read(),m=read(); 
	for(int i=1,u,v,w;i<=m;i++){
		u=read(),v=read(),w=read();
		G[u].push_back({v,w});
		G[v].push_back({u,w});
	}dijkstra(1);
	write(dis[n][1]);
	return 0;
}
2023/9/20 22:03
加载中...