5个一维数组+2个二维数组+O(n²)算法+TLE求调
查看原帖
5个一维数组+2个二维数组+O(n²)算法+TLE求调
1471248
lifeam楼主2025/1/22 15:39
#include<bits/stdc++.h>
using namespace std;
int cnt=0,n,m,x,y;
bool ff=0;
int a[10086][10086],b[10086][10086];
bool vis[10086],use[10086],usee[10086]; 
struct node{
	int la,to;
}ans[10086];
void find(int p){
	vis[p]=1;
	if (a[p][0]==0||a[0][p]==0){
		ans[p].la=ans[p].to=p;
		return;
	}
	for (int i=1;i<=a[p][0];i++){
		if (vis[a[p][i]]){
			if (ans[a[p][i]].to!=0){
				ans[p].to=ans[a[p][i]].to;
				ans[p].la=a[p][i];
				ans[ans[a[p][i]].to].la=p;
				ans[a[p][i]].to=p;
				return;
			}
			ff=1;
			ans[p].to=a[p][i];
			ans[a[p][i]].la=p;
			return;
		}
		find(a[p][i]);
		if (ff){
			if (ans[p].la!=0) ff=0;
			ans[p].to=a[p][i];
			ans[a[p][i]].la=p;
			return;
		}
	}
	return;
}
void print2(int u){
	for (int i=1;i<=n;i++){
		if (i==u) continue;
		if (b[i][ans[u].to]&&b[u][i]){
			int start=ans[i].to;
			ans[ans[u].to].la=i;
			ans[start].la=u;
			ans[i].to=ans[u].to;
			ans[u].to=start;
		}
	}
	return;
}
void print1(int u){
	use[u]=1;
	if (use[ans[u].to]){
		cnt++;
		return;
	}
	print1(ans[u].to);
	return;
}
void print(int u){
	usee[u]=1;
	if (usee[ans[u].to]){
		cout<<u<<endl;
		return;
	}
	cout<<u<<" ";
	print(ans[u].to);
	return;
}
int main(){
	scanf("%d%d",&n,&m);
	for (int i=1;i<=m;i++){
		scanf("%d%d",&x,&y);
		a[x][++a[x][0]]=y;
		a[0][y]++;
		b[x][y]=1;
	}
	for (int i=1;i<=n;i++){
		if (vis[i]) continue;
		ff=0;
		find(i);
	}
	for (int i=1;i<=n;i++){
		print2(i);
	}
	use[0]=1;
	for (int i=1;i<=n;i++){
		if (use[i]) continue;
		print1(i);
	}
	cout<<cnt<<endl;
	usee[0]=1;
	for (int i=1;i<=n;i++){
		if (usee[i]) continue;
		print(i);
	}
	return 0;
}
2025/1/22 15:39
加载中...