4 TLE求助 Dijkstra
查看原帖
4 TLE求助 Dijkstra
409774
Maysoul楼主2023/5/5 18:48
//2023/5/4
//别着急,先通读一遍题目
//别忘了开long long
//写完先看一遍怎么降复杂度
//要么开全局变量要么给定初值
//想想看,有什么情况需要特判
//std::ios::sync_with_stdio(false), cin.tie(0), cout.tie(0);
#include<bits/stdc++.h>
using namespace std;
const int MAXN=1e6+10;
const int INF=0x3f3f3f3f;
int num,ans;
int n,m,s,t; 
int read()
{
	int s=0,w=1;
	char ch=getchar();
	while(ch<'0'||ch>'9'){if(ch=='-'){w=-1;}ch=getchar();}
	while(ch>='0'&&ch<='9'){s=s*10+ch-'0';ch=getchar();}
	return s*w;
}
struct node{
	int id;
	int dist;
	node()
	{
		id=0;dist=0;
	}
	node(int c,int d)
	{
		id=c;dist=d;
	}
	bool operator < (const node &x)const
	{
		return x.dist<dist;
	}
};
priority_queue<node> que;
struct linkstar{
	int to,from;
	int w;
	int next;
}edge[330000];
int head[330000];
int dis[330000];
int vis[330000];
int escnt;
void add(int from,int to,int w)
{
	edge[++escnt].from=from;
	edge[escnt].to=to;
	edge[escnt].w=w;
	edge[escnt].next=head[from];
	head[from]=escnt;
}
void Dijkstra(int u)
{
	for (int i=1;i<=n;i++)
	{
		dis[i]=INF;
	}
	memset(vis,0,sizeof(vis));
	dis[u]=0;
	que.push(node(u,0));
	int cnt=0;
	while(que.size())
	{
		node cp=que.top();
		que.pop();
		if(vis[cp.id]) continue;
		cnt++;
		vis[cp.id]=true;
		for (int i=head[cp.id];i!=-1;i=edge[i].next)
		{
			
			if(dis[edge[i].to]>max(dis[cp.id],edge[i].w))
			{
				dis[edge[i].to]=max(dis[cp.id],edge[i].w);
				if(!vis[edge[i].to])
				{
					que.push(node(edge[i].to,dis[edge[i].to]));
				}
			}
		}
	}
}
int main()
{
	memset(head,-1,sizeof(head));
	n=read();
	m=read();
	t=read();
	for (int i=1;i<=m;i++)
	{
		int x,y,w;
		x=read();
		y=read();
		w=read();
		add(x,y,w);
	}
	for (int i=1;i<=t;i++)
	{
		int as,az;
		as=read();
		az=read();
		Dijkstra(as);
		dis[az]==INF? cout<<"-1"<<endl : cout<<dis[az]<<endl;
	}
	return 0;
}



2023/5/5 18:48
加载中...