模版

最短路

#include<bits/stdc++.h>
using namespace std;
#define il inline
#define inf 0x3f3f3f3f
namespace Single_Shortest_Path
{
	#define N 100001
	#define M 200002
	long long dis[N];
	bool tag[N];
	struct Graph
	{
		int cnt,head[N],to[M],nxt[M];
		long long len[M];
		il void build(int x,int y,long long z)
		{
			cnt++;
			to[cnt]=y;
			len[cnt]=z;
			nxt[cnt]=head[x];
			head[x]=cnt;
		}
	}g;
	il void dijkstra(int x)
	{
		priority_queue<pair<long long,int>>pq;
		memset(dis,inf,sizeof(dis)),dis[x]=0;
		memset(tag,false,sizeof(tag));
		pq.push({0,x});
		while(!pq.empty())
		{
			pair<long long,int>y=pq.top();
			pq.pop();
			if(tag[y.second]==true)
			{
				continue;
			}
			dis[y.second]=-y.first;
			tag[y.second]=true;
			for(int i=g.head[y.second];i;i=g.nxt[i])
			{
				int z=g.to[i];
				if(dis[z]>-y.first+g.len[i])
				{
					dis[z]=-y.first+g.len[i];
					pq.push({y.first-g.len[i],z});
				}
			}
		}
	}
	il void spfa(int x)
	{
		queue<int>q;
		memset(dis,inf,sizeof(dis)),dis[x]=0;
		memset(tag,false,sizeof(tag));
		q.push(x),tag[x]=true;
		while(!q.empty())
		{
			int y=q.front();
			q.pop();
			tag[y]=false;
			for(int i=g.head[y];i;i=g.nxt[i])
			{
				int z=g.to[i];
				if(dis[z]>dis[y]+g.len[i])
				{
					dis[z]=dis[y]+g.len[i];
					if(!tag[z])
					{
						q.push(z);
						tag[z]=true;
					}
				}
			}
		}
	}
	#undef N
	#undef M
}
namespace Full_Shortest_Path
{
	#define N 1001
	long long dis[N][N];
	il void prepare(int x)
	{
		memset(dis,inf,sizeof(dis));
		for(int i=1;i<=x;i++)
		{
			dis[i][i]=0;
		}
	}
	il void build(int x,int y,long long z)
	{
		dis[x][y]=min(z,dis[x][y]);
	}
	il void floyd(int x)
	{
		for(int i=1;i<=x;i++)
		{
			for(int j=1;j<=x;j++)
			{
				for(int k=1;k<=x;k++)
				{
					dis[i][j]=min(dis[i][j],dis[i][k]+dis[k][j]);
				}
			}
		}
	}
	#undef N
}
using namespace Single_Shortest_Path;
int a,b,c,u,v,w;
int main()
{
//	freopen(".in","r",stdin);
//	freopen(".out","w",stdout);
	scanf("%d%d%d",&a,&b,&c);
	for(int i=1;i<=b;i++)
	{
		scanf("%d%d%d",&u,&v,&w);
		g.build(u,v,w);
	}
	spfa(c);
	for(int i=1;i<=a;i++)
	{
		if(dis[i]==4557430888798830399)
		{
			printf("2147483647 ");
		}
		else
		{
			printf("%lld ",dis[i]);
		}
	}
	return 0;
}
/*

*/
posted @ 2026-07-11 18:11  一位很会的教授er~  阅读(19)  评论(1)    收藏  举报