关于dijsktra(悬关)
  • 板块学术版
  • 楼主letianJOE
  • 当前回复3
  • 已保存回复3
  • 发布时间2024/10/5 11:56
  • 上次更新2024/10/5 14:45:53
查看原帖
关于dijsktra(悬关)
658497
letianJOE楼主2024/10/5 11:56
#include<bits/stdc++.h>
using namespace std;
const int N=5*1e5;
const int inf=2147483647;  
int cnt;
int n,m,start;
int dis[N+5];
int head[N+5],to[N+5],nxt[N+5],weight[N+5];
bool book[N+5];
priority_queue<pair<int,int>,vector<pair<int,int> >,greater<pair<int,int> > >que;
void add_edge(int u,int v,int w)
{
	cnt++;
	to[cnt]=v;
	weight[cnt]=w;
	nxt[cnt]=head[u];
	head[u]=cnt;
}
main()
{
	cin>>n>>m>>start;
	for(int i=1;i<=n+5;i++)
		dis[i]=inf;
	for(int i=1;i<=m;i++)
	{
		int u,v,w;
		cin>>u>>v>>w;
		add_edge(u,v,w);
	}
	dis[start]=0;
	que.push(make_pair(0,start));
	while(que.size())
	{
		int trans=que.top().second;
		que.pop();
		if(book[trans])
			continue;
		book[trans]=true;
//		cout<<trans<<"\n"; 
		for(int i=head[trans];i;i=nxt[i])
		{
			int need=dis[trans]+weight[i];
			if(dis[to[i]]>need)
			{
				dis[to[i]]=need;
				que.push(make_pair(dis[to[i]],to[i]));
			}
		}
	}
	for(int i=1;i<=n;i++)
		cout<<dis[i]<<" ";
	return 0;
}
#include<bits/stdc++.h>
using namespace std;
const int N=5*1e5;
const int inf=2147483647;  
int cnt;
int n,m,start;
int dis[N+5];
int head[N+5],to[N+5],nxt[N+5],weight[N+5];
bool book[N+5];
priority_queue<pair<int,int>,vector<pair<int,int> >,greater<pair<int,int> > >que;
void add_edge(int u,int v,int w)
{
	cnt++;
	to[cnt]=v;
	weight[cnt]=w;
	nxt[cnt]=head[u];
	head[u]=cnt;
}
void dijsktra()
{
	priority_queue<int,vector<int>,greater<int> >que;
	dis[start]=0;
	que.push(start);
	while(que.size())
	{
		int trans=que.top();
		que.pop();
		if(book[trans])
			continue;
		book[trans]=true;
		for(int i=head[trans];i;i=nxt[i])
		{
			int need=dis[trans]+weight[i];
			if(dis[to[i]]>need)
			{
				dis[to[i]]=need;
				que.push(to[i]);
			}
		}
	}
}
main()
{
	cin>>n>>m>>start;
	for(int i=1;i<=n+5;i++)
		dis[i]=inf;
	for(int i=1;i<=m;i++)
	{
		int u,v,w;
		cin>>u>>v>>w;
		add_edge(u,v,w);
	}
	dijsktra(); 
	for(int i=1;i<=n;i++)
		cout<<dis[i]<<" ";
	return 0;
}

这两份代码后面的是36分,但是似乎第一份代码中的队列似乎只用到了表示结点的值,没有用到前面的值。

为什么删掉这个没有用到的值会是答案发生偏差的?

2024/10/5 11:56
加载中...