样例点RE?
查看原帖
样例点RE?
199459
Masna_Kimoyo楼主2021/3/3 22:57

本蒟蒻的代码,样例点过了,不知道哪里错了

而且我也不明白,明明每一个答案都小于等于 nn 啊,而且 nn 也没有爆int,为什么别人说要开long long啊

#include<bits/stdc++.h>
#define ll long long
using namespace std;
priority_queue <int> q;
const int N=1e5+5,INF=2147483647;
int dis[N],head[N],pre[N];
int n,m,tot,cnt;
ll ans[N];
bool vis[N];
bool flag;
struct node{
	int to,w,next;
}Edge[N];
inline int read()
{
	int x=0;
	bool w=0;
	char c=getchar();
	while(!isdigit(c))
		w|=c=='-',c=getchar();
	while(isdigit(c))
		x=(x<<1)+(x<<3)+(c^48),c=getchar();
	return w?-x:x;
}
inline void SPFA()
{
	q.push(1);vis[1]=1;
	while(!q.empty())
	{
		int u=q.top();
		q.pop();vis[u]=0;
		for(register int i=head[u];i;i=Edge[i].next)
		{
			int v=Edge[i].to,w=Edge[i].w;
			if(dis[u]+w<dis[v])
			{
				dis[v]=dis[u]+w;
				pre[v]=u;
				if(!vis[v])
					vis[v]=1,q.push(v);
			}
		}
	}
}
inline void add(int u,int v,int w)
{
	Edge[++tot].w=w;
	Edge[tot].to=v;
	Edge[tot].next=head[u];
	head[u]=tot;
}
signed main()
{
	n=read(),m=read();
	for(register int i=1;i<=n;++i)
		dis[i]=INF;dis[1]=0;
	for(register int i=1;i<=m;++i)
	{
		int u=read(),v=read(),w=read();
		add(u,v,w);add(v,u,w);
	}
	SPFA();
	for(register int i=n;i>=1;i=pre[i])
	{
		ans[++cnt]=i;
		if(i==1)	flag=1;
	}
	if(!flag)	
	{
		printf("-1");
		return 0;
	}
	for(register int i=cnt;i>=1;--i)
		printf("%lld ",ans[i]);
	return 0;
}

2021/3/3 22:57
加载中...