1,6两个点TLE求助
查看原帖
1,6两个点TLE求助
341122
lx503楼主2021/10/21 23:37

如题,用了

if(dis[t]<tmp.first)continue;

优化,但还是过不了1,6两个点。

#include<bits/stdc++.h>
#define P pair<int,int>
#define inf 1000000000
using namespace std;
int n,m,s;
int u,v,w;
vector<P>g[100001];
int dis[100001];
//bool used[100001];
priority_queue<P>a;
int main()
{
//	freopen(".in","r",stdin);
//	freopen(".out","w",stdout);
	scanf("%d%d%d",&n,&m,&s);
	for(int i=1; i<=m; i++)
	{
		scanf("%d%d%d",&u,&v,&w);
		g[u].push_back(make_pair(w,v));
	}
	for(int i=1; i<=n; i++)
		dis[i]=inf;
	dis[s]=0;
	a.push(make_pair(0,s));
	while(!a.empty())
	{
		P tmp=a.top();
		a.pop();
		int t=tmp.second;
		//	cout<<tmp.first<<" "<<tmp.second<<endl;
		if(dis[t]<tmp.first)//已经松弛过 
		continue;
		for(int j=0; j<g[t].size(); j++)
		{
			P t1=g[t][j];
			if(dis[t1.second]>dis[t]+t1.first)
			{
				dis[t1.second]=dis[t]+t1.first;
				a.push(make_pair(dis[t1.second],t1.second));
			}
		}

	}
	for(int i=1; i<=n; i++)
		printf("%d ",dis[i]);
	return 0;
}
2021/10/21 23:37
加载中...