求助,测试点2,3,6TLE
查看原帖
求助,测试点2,3,6TLE
356081
Night_7d5楼主2020/12/12 22:16
#include<bits/stdc++.h>
using namespace std;
const int INF=0x3f3f3f3f,M=2e5+1,N=1e5+1;
int dis[N];
bool flag[N];
inline int read()
{
    int X=0,w=1; 
	char c=getchar();
    while (c<'0'||c>'9') { if (c=='-') w=-1; c=getchar(); }
    while (c>='0'&&c<='9') X=(X<<3)+(X<<1)+c-'0',c=getchar();
    return X*w;
}
struct edge
{
	int to;
	int w;
	int next;
}edge[M];
int head[N],cnt=0;
struct node
{
	int index,dist;
       bool operator < (const node &x)const
       {
          return dist>x.dist;
       }
};
inline void add(int u,int v,int w)
{
	edge[++cnt].to=v;
	edge[cnt].w=w;
	edge[cnt].next=head[u];
	head[u]=cnt;
}
int main()
{
	priority_queue<node>q;
	int n,m,s;
	int u,v,w;
	n=read();m=read();s=read();
	for(int i=1;i<=n;i++) 
	{
		dis[i]=INF;
	}
	dis[s]=0;
	for(int i=1;i<=m;i++)
	{
		u=read();v=read();w=read();
		add(u,v,w);
	}
	q.push(node{s,0});
	while(!q.empty())
	{
		node k=q.top();
		int t=k.index;
		q.pop();
		flag[t]=true;
		int minn=INF;
		for(int i=head[t];i!=0;i=edge[i].next)
		{
			if(!flag[edge[i].to]&&edge[i].w+dis[t]<dis[edge[i].to])
			{
				dis[edge[i].to]=edge[i].w+dis[t];
				q.push({edge[i].to,dis[edge[i].to]});
			}
		}
		
	}
	for(int i=1;i<=n;i++)
	{
		printf("%d ",dis[i]);
	}
	return 0;
}
2020/12/12 22:16
加载中...