我发现了一个只有oier能找到的乐子
  • 板块灌水区
  • 楼主PDAST
  • 当前回复1
  • 已保存回复1
  • 发布时间2024/12/9 13:55
  • 上次更新2024/12/9 17:34:46
查看原帖
我发现了一个只有oier能找到的乐子
982629
PDAST楼主2024/12/9 13:55

求调abc233f,玄关。

#include<bits/stdc++.h>
using namespace std;
struct Edge{
	int to,id;
};
int a[10001],vis[10001],p[10001],st[500001];
vector<Edge>g[10001];
int n,m,cnt;
bool swapOT(int from,int to,int fa){
	if(from==to)return 1;
	for(auto i:g[from]){
		if(i.to==fa)continue;
		int tmp=swapOT(i.to,to,from);
		if(tmp){
			swap(a[from],a[i.to]);
			swap(p[a[from]],p[i.to]);
			st[++cnt]=i.id;
			return 1;
		}
	}
	return 0;
}
void dfs(int x){
	vis[x]=1;
	for(auto i:g[x]){
		if(!vis[i.to])dfs(i.to);
	}
	if(!swapOT(p[x],x,0)){
		cout<<-1;
		exit(0);
	}
}
int main(){
	cin>>n;
	for(int i=1;i<=n;i++)cin>>a[i],p[a[i]]=i;
	cin>>m;
	for(int i=1;i<=m;i++){
		int u,v;
		cin>>u>>v;
		g[u].push_back({v,i});
		g[v].push_back({u,i});
	}
	for(int i=1;i<=n;i++){
		if(!vis[i])dfs(i);
	}
	cout<<cnt<<"\n";
	for(int i=1;i<=cnt;i++)cout<<st[i]<<" ";
}
2024/12/9 13:55
加载中...