#4 #5没过 dij方法 求助
查看原帖
#4 #5没过 dij方法 求助
170047
小渣青999楼主2020/8/14 20:45
#include<cstdio>
#include<vector> 
#include<queue>
using namespace std;
struct node
{
	int dis,too;
	bool operator <( const node &x )const
    {
        return x.dis < dis;
    }
};
vector<node> v[100010];
priority_queue<node> q;
int n,m,s;
int read()
{
	int x=0,f=1;
	char c=getchar();
	while(c>'9'||c<'0')
	{
		if(c=='-')  f=-1;
		c=getchar();
	}
	while(c>='0'&&c<='9')
	{
		x=x*10+c-'0';
		c=getchar();
	}
	return x*f;
}
int d[100010],vis[100010],pre[100010];

void dij()
{
	fill(d,d+100010,99999999);
	fill(vis,vis+100010,0);
	d[s]=0;
	q.push((node){0,s});
	while(!q.empty())
	{
		node tmp=q.top();
		int x=tmp.too;
		q.pop();
	
		if(vis[x]) continue;
		vis[x]=1;
		for(int i=0;i<v[x].size();i++)
		{
			int y=v[x][i].too;
			int dis=v[x][i].dis;
	
			if(dis+d[x]<d[y])
			{
				d[y]=dis+d[x];
				if(vis[y]==0)  q.push((node){d[y],y});
			}
		}
	 } 

 } 
int main()
{
	n=read(),m=read(),s=read();
	for(int i=0;i<m;i++)
	{
	
		int a=read(),b=read(),c=read();
		v[a].push_back((node){c,b});
	}
	dij();

	for(int i=1;i<=n;i++) printf("%d ",d[i]); 
	return 0;
}
2020/8/14 20:45
加载中...