RE在哪里啊,RE在哪里?
查看原帖
RE在哪里啊,RE在哪里?
363491
U_92_Uranium楼主2022/1/18 09:42

请各位大佬帮忙看看为什么dij RE了。


思路:堆优化的dij,pair中第一个int是顶点到 s 的距离的相反数,大根堆->小根堆。第二个int是顶点号

#include <bits/stdc++.h>
using namespace std;
const int maxn=1e5+1,maxm=2e5+1,Inf=0x3f3f3f3f;
priority_queue <pair<int,int> > q;
struct EDGE {
	int w,v,next;
} e[maxm];
int head[maxn]={0},cnt=0,dis[maxn],vis[maxn],n,m,s;
void Adde(int u,int v,int w)
{
	++cnt;
	e[cnt].v=v;
	e[cnt].w=w;
	e[cnt].next=head[u];
	head[u]=cnt;
}

void Dij()
{
	//初始化
	memset(dis,Inf,sizeof(dis));
	memset(vis,0,sizeof(vis));

	//把起点的距离初始化为0,压入堆
	dis[s]=0;
	q.push(make_pair(0,s));

	//不断取出最小值,循环更新其他点
	while(!q.empty()) {
		int tmp=q.top().second;
		q.pop();
		if(vis[tmp]==0) {//在为访问的点中找最小值
			vis[tmp]=1;
			//遍历所有出边更新邻点
			for(int i=head[tmp]; i!=0; i=e[i].next) {
				if(dis[e[i].v]>dis[tmp]+e[i].w) {
					dis[e[i].v]=dis[tmp]+e[i].w;
					q.push(make_pair(-dis[e[i].v],e[i].v));
				}
			}
		}
	}
	return;
}

int main()
{

	int u,v,w;
	scanf("%d%d%d",&n,&m,&s);

	//建图
	for(int i=1; i<=m; ++i) {
		scanf("%d%d%d",&u,&v,&w);
		Adde(u,v,w);
	}

	Dij();

	for(int i=1; i<=n; ++i) {
		if(dis[i]==Inf) {
			printf("%d",(1<<31)-1);
		} else {
			printf("%d ",dis[i]);
		}

	}
	return 0;
}

2022/1/18 09:42
加载中...