思路参考的一篇博文,写的很清楚:http://www.cnblogs.com/damacheng/archive/2010/09/24/1833983.html
我对他的代码做了优化,用数组实现了堆栈
#include <iostream>
using namespace std;
const int MAX_NUM = 10002;
int cluster[MAX_NUM];
int stack[MAX_NUM];
int n, k;
void solve()
{
int i, op_num = 0, next, top;
for (i = 1; i <= n; ++i){
if (cluster[i] != 0 && cluster[i] != i){
bool circle = false;
top = -1;
stack[i] = top; //push(i)
top = i;
while (true){
next = cluster[top];
stack[next] = top; //push(cluster[top])
top = next;
if (cluster[next] == 0){
break;
}
if (cluster[next] == i){
circle = true;
break;
}
}
int empty = n;
if (circle){
while (cluster[empty] != 0)
empty--;
stack[empty] = top;
top = empty;
}
next = stack[top];
while (next != -1){
cluster[top] = cluster[next];
cluster[next] = 0;
printf("%d %d\n", next, top);
top = next;
next = stack[top];
op_num++;
}
if (circle){
printf("%d %d\n", empty, i);
cluster[i] = cluster[empty];
cluster[empty] = 0;
op_num++;
}
}
}
if (op_num == 0){
printf("No optimization needed\n");
}
}
int main()
{
//freopen("in.txt","r",stdin);
int i, j, m, t, sn = 1;
scanf("%d%d", &n, &k);
for (i = 0; i < k; ++i){
scanf("%d", &m);
for (j = 0; j < m; ++j){
scanf("%d", &t);
cluster[t] = sn++;
}
}
solve();
return 0;
}