WA on #31求助
查看原帖
WA on #31求助
703085
Myosotis_alpestris楼主2023/7/24 14:37

Dijkstra板子

看讨论区里有说加long long的,我加了,有说改最大值的,我也改了,但是还是过不去,求解。

#include<bits/stdc++.h>
#define int long long 
using namespace std;
const int MAXN=1e5+10;
const int INF=LONG_MAX;
int num,ans;
int n,m,s,t; 
struct node{
	int id;
	int dist;
	node(){	id=0;dist=0;}
	node(int c,int d){id=c;dist=d;}
	bool operator < (const node &x)const{return x.dist<dist;}
};
priority_queue<node> que;
struct linkstar{
	int to,from;
	int w;
	int next;
}edge[2*MAXN];
int head[MAXN];
int dis[MAXN];
int vis[MAXN];
int pre[MAXN];
int escnt;
void add(int from,int to,int w)
{
	edge[++escnt].from=from;
	edge[escnt].to=to;
	edge[escnt].w=w;
	edge[escnt].next=head[from];
	head[from]=escnt;
}
void Dijkstra(int u)
{
	for (int i=1;i<=n;i++)	dis[i]=INF;
	dis[u]=0;
	que.push(node(u,0));
	int cnt=0;
	while(que.size()){
		node cp=que.top();
		que.pop();
		if(vis[cp.id]) continue;
		vis[cp.id]=true;
		for (int i=head[cp.id];i!=-1;i=edge[i].next){
			if(dis[edge[i].to]>dis[cp.id]+edge[i].w){
				dis[edge[i].to]=dis[cp.id]+edge[i].w;
				pre[edge[i].to]=cp.id;
				if(!vis[edge[i].to]){
					que.push(node(edge[i].to,dis[edge[i].to]));
				}
			}
		}
	}
}
stack<int> stk;
signed main()
{
	memset(head,-1,sizeof(head));
	cin>>n;
	cin>>m;
	for (int i=1;i<=m;i++)
	{
		int x,y,w;
		cin>>x>>y>>w;
		add(x,y,w);
		add(y,x,w);
	}
	Dijkstra(1);
	int last=n;
	//cout<<dis[n]<<endl;
	/*for (int i=1;i<=n;i++){
		cout<<pre[i]<<" ";
	}*/
	if(dis[n]==INF){
		cout<<"-1"<<endl;
		return 0;
	}
	while(last){
		stk.push(last);
		last=pre[last];
	}
	while(stk.size()){
		cout<<stk.top()<<" ";
		stk.pop();
	}
	return 0;
}


2023/7/24 14:37
加载中...