dij 68 求助
查看原帖
dij 68 求助
396994
Winston12321_楼主2022/8/21 21:30

代码如下

读不懂私我啊

#include <iostream>
#include <vector>
#include <queue> 
using namespace std;
const int N=100010;
const int INF=2147483647;
int n,m,st;
int a;
long long dis[N];
vector<int>son[N],side[N];
bool vis[N];
struct node{int id;};
bool operator <(node a,node b){return dis[a.id]>dis[b.id];}
priority_queue<node>now;
int read()
{
	int s=0;
	char ch=getchar();
	while(!isdigit(ch)) ch=getchar();
	while(isdigit(ch))
	{
		s=(s<<3)+(s<<1)+(ch^48);
		ch=getchar();
	}
	return s;
}
void dij()
{
	while(true)
	{
		int temp=now.top().id;
		while(vis[temp] && !now.empty()) now.pop(),temp=now.top().id;
		if(now.empty()) return;
		now.pop();
		vis[temp]=1;
		for(int i=0;i<son[temp].size();++i) dis[son[temp][i]]=min(dis[son[temp][i]],dis[temp]+side[temp][i]),now.push(node{son[temp][i]});
	}
}
int main()
{
	n=read();
	m=read();
	st=read();
	for(int i=1;i<=m;++i) a=read(),son[a].push_back(read()),side[a].push_back(read());
	for(int i=1;i<=n;++i) dis[i]=INF;
	dis[st]=0,now.push(node{st});
	dij();
	for(int i=1;i<=n;i++) cout<<dis[i]<<' ';
	return 0;
}
2022/8/21 21:30
加载中...