堆优化 dijkstra 求助(
  • 板块学术版
  • 楼主E1_de5truct0r
  • 当前回复8
  • 已保存回复8
  • 发布时间2021/5/15 09:54
  • 上次更新2023/11/4 23:15:51
查看原帖
堆优化 dijkstra 求助(
195198
E1_de5truct0r楼主2021/5/15 09:54

RT,似乎是RE了,救救我(

站外题 https://hdnoip.cn/problem.php?id=1334

stOOOOOO OOOOOOrz

#include <stdio.h>
#include <queue>
#include <iostream>
#include <string.h>
using namespace std;

#define rint register int
#define ll long long
const int MAXN=2505,MAXM=6205;

int read(int &w)
{
	w=0;char ch=getchar();int f=1;
	for(;!(ch>='0'&&ch<='9');ch=getchar())if(ch=='-')f=-1;
	for(;(ch>='0'&&ch<='9');ch=getchar())w=(w<<1)+(w<<3)+(ch^48);
	w*=f;
}

int tot=0,n,m,Start,End;
int head[MAXN],dis[MAXN],vis[MAXN];
struct Edge
{
	int to,le,nxt;
	Edge(){to=0;le=0;nxt=0;}
};
Edge a[MAXM];
void add(int x,int y,int z)
{
	tot++;
	a[tot].to=y;
	a[tot].le=z;
	a[tot].nxt=head[x];
	head[x]=tot;
}

void Dijkstra()
{
	memset(dis,0x3f,sizeof(dis));
	memset(vis,0,sizeof(vis));
	priority_queue<pair<int,int>,vector<pair<int,int> >,greater<pair<int,int> > >q;
	dis[Start]=0;
	q.push(make_pair(0,Start));
	while(q.size())
	{
		int tmp=q.top().second;q.pop();
		if(vis[tmp]) continue;
		vis[tmp]=1;
		for(rint i=head[tmp];i;i=a[i].nxt)
		{
			int t=a[i].to; if(vis[t])continue;
			if(dis[t]>dis[tmp]+a[i].le)
			{
				dis[t]=dis[tmp]+a[i].le;
				q.push(make_pair(dis[t],t));
			}
		}
	}
	printf("%d",dis[End]);
}

int main()
{
	read(n);read(m);read(Start);read(End);
	for(rint i=1;i<=m;i++)
	{
		int x,y,z;
		read(x);read(y);read(z);
		add(x,y,z);
		add(y,x,z);
	}
	Dijkstra();
	return 0;
}
2021/5/15 09:54
加载中...