//poj 1033
//sep9
#include <iostream>
using namespace std;
const int MAXN=10024;
int a[MAXN],vis[MAXN],N,K;
int zero_pos,flag;
void dfs(int i)
{
if(a[i]==i||a[i]==0) return;
if(vis[a[i]]==1){
printf("%d %d\n",i,zero_pos);
flag=zero_pos;
a[zero_pos]=a[i];
a[i]=0;
zero_pos=i;
return ;
}
vis[i]=1;
dfs(a[i]);
printf("%d %d\n",i,a[i]);
a[a[i]]=a[i];
a[i]=0;
zero_pos=i;
return ;
}
int main()
{
scanf("%d%d",&N,&K);
memset(a,0,sizeof(a));
int pos=0;
for(int i=0;i<K;++i){
int num;
scanf("%d",&num);
while(num--){
int x;
scanf("%d",&x);
a[x]=++pos;
}
}
for(int i=1;i<=N;++i)
if(a[i]==0) zero_pos=i;
bool no_need=true;
for(int i=1;i<=N;++i){
if(a[i]==i||a[i]==0) continue;
no_need=false;
memset(vis,0,sizeof(vis));
flag=-1;
dfs(i);
if(flag>=0){
printf("%d %d\n",flag,i);
swap(a[flag],a[i]);
zero_pos=flag;
}
}
if(no_need==true) puts("No optimization needed");
return 0;
}
poj 1033 Defragment 模拟+递归
最新推荐文章于 2022-01-09 22:54:24 发布