蒟蒻站外题MLE求调
  • 板块灌水区
  • 楼主PCCP
  • 当前回复2
  • 已保存回复2
  • 发布时间2023/1/15 18:54
  • 上次更新2023/10/24 04:06:20
查看原帖
蒟蒻站外题MLE求调
310773
PCCP楼主2023/1/15 18:54

道路与航线是算法进阶指南的一道题,萌新目前MLE多次,心态炸裂,请大佬帮帮蒟蒻看看代码吧。

#include<iostream>
#include<cmath>
#include<cstring>
#include<cstdio>
#include<algorithm>
#include<queue>
#include<vector>
using namespace std;
typedef pair<int,int> PII;
const int N=50001;
const int M=25000;
int t,r,p,s,cnt,indeg[M],fa[M],dist[M];
int he[N],ne[N],to[N],tot1,l[N];
bool st[M];
queue <int> q;
vector <int> sdcc[M];
void addedge1(int x,int y,int z){
	to[++tot1]=y;
	ne[tot1]=he[x];
	he[x]=tot1;
	l[tot1]=z;
}
void dfs(int now,int father){
	sdcc[cnt].push_back(now);
	for(int i=he[now];i;i=ne[i]){
		int v=to[i];
		if(v==father){
			continue;
		}
		
		fa[v]=cnt;
		dfs(v,now);
	}
}
priority_queue <PII,vector<PII>,greater<PII> > pp;
int main(){
	scanf("%d%d%d%d",&t,&r,&p,&s);
	int u,v,w;
	for(int i=1;i<=r;i++){
		scanf("%d%d%d",&u,&v,&w);
		addedge1(u,v,w);
		addedge1(v,u,w);
	}
	for(int i=1;i<=t;i++){
		if(!fa[i]){
			fa[i]=++cnt;
			dfs(i,0);
		}
	}
	for(int i=1;i<=p;i++){
		scanf("%d%d%d",&u,&v,&w);
		++indeg[fa[v]];
		addedge1(u,v,w);
	}
	q.push(fa[s]);
	for(int i=1;i<=cnt;i++){
		if(indeg[i]==0&&fa[s]!=i){
			q.push(i);
		}
	}
	memset(dist,0x3f,sizeof dist);
	memset(st,false,sizeof st);
	dist[s]=0;
	vector <int>::iterator item;
	while(q.size()){
		int m=q.front();
		q.pop();
		for(item=sdcc[m].begin();item!=sdcc[m].end();item++){
			pp.push(PII(dist[*item],*item));
		}
		while(pp.size()){
			PII e=pp.top();
			pp.pop();
			if(st[e.second]==true){
				continue;
			}
			st[e.second]=true;
			for(int i=he[e.second];i;i=ne[i]){
				v=to[i];
				if(e.first+l[i]<dist[v]){                                        
					dist[v]=e.first+l[i];
					if(fa[e.second]==fa[v]&&!st[v]){
						pp.push(PII(dist[v],v));
					}
				}
			}
			if(fa[e.second]!=fa[v]){
				--indeg[fa[v]];
				if(indeg[fa[v]]==0){
					q.push(fa[v]);
				}
			}
		}
	}
	for(int i=1;i<=t;i++){
		if(dist[i]>=0x3f3f3f3f3f3f3f3f){
			printf("NO PATH\n");
		}
		else{
			printf("%d\n",dist[i]);
		}
	}
}
2023/1/15 18:54
加载中...