6AC,4TLE,求调
  • 板块P3916 图的遍历
  • 楼主mrbhsj
  • 当前回复0
  • 已保存回复0
  • 发布时间2024/7/25 09:42
  • 上次更新2024/7/25 10:48:43
查看原帖
6AC,4TLE,求调
764059
mrbhsj楼主2024/7/25 09:42
#include<bits/stdc++.h>
using namespace std;
struct edge{
	int u,v;
}e[100010];
int fir[1000005],las[1000005],d[1000005],maxx=-1;
int maxxx=-1;
bool b[1000005];
bool cmp(edge x,edge y){
	if(x.u==y.u) return x.v<y.v;
	else return x.u<y.u;
}
void dfs(int u){
	b[u]=true;
	maxx=max(maxx,u);
	for(int i=fir[u];i<=las[u];i++){
		int v=e[i].v;
		if(v!=0 and !b[v]) dfs(v);
	}
}

void bfs(int u){
	memset(b,false,sizeof(b));
	d[1]=u;
	b[u]=true;
	int h=1,r=1;
	while(h<=r){
		int u=d[h];
		for(int i=fir[u];i<=las[u];i++){
			int v=e[i].v;
			if(v!=0 and !b[v]){
				d[++r]=v;
				b[v]=true;
			} 
		}
		h++;
		maxxx=max(maxxx,u);
	}
	
}

int main(){
	int n,m;
	cin>>m>>n;
	for(int i=1;i<=n;i++){
		cin>>e[i].u>>e[i].v;
	}
	sort(e+1,e+1+n,cmp);
	for(int i=1;i<=n+1;i++){
		int u=e[i].u;
		int v=e[i-1].u;
		if(u!=v){
			fir[u]=i;
			las[v]=i-1;
		}	
	}
	for(int i=1;i<=m;i++){
		
		dfs(i);
		if(maxx==m){
			cout<<maxx<<" ";
			maxx=-1;
		}
		else{
			bfs(i);
			cout<<max(maxx,maxxx)<<" ";
			maxx=maxxx=-1;
		}
		
	}
}

2024/7/25 09:42
加载中...