#include<cstdio>
#include<iostream>
#include<cstring>
#include<vector>
#include<algorithm>
using namespace std;
const int maxn=100+5;
int d[maxn][maxn];
vector<int> G[maxn],Q,T[maxn][3];
int id[maxn];
int flag,cnt;
int t[3];
int a[maxn];
bool dfs(int u){
if(id[u]==0){
t[flag+1]++; // t在dfs前需要初始化
id[u]=flag;
T[cnt][flag+1].push_back(u);
}
else if(id[u]==flag) return true;
else return false;
flag=(-1)*flag;
int f=flag;
for(int i=0;i<G[u].size();i++){
int v=G[u][i];
if(!dfs(v)) return false;
flag=f;//
}
return true;
}
void print(){
int s1=0,s2=0;
for(int i=0;i<cnt;i++){
s1+=T[i][0].size();
s2+=T[i][2].size();
}
cout<<s1;
for(int i=0;i<cnt;i++)
for(int j=0;j<T[i][0].size();j++)
cout<<" "<<T[i][0][j];
cout<<endl;
cout<<s2;
for(int i=0;i<cnt;i++)
for(int j=0;j<T[i][2].size();j++)
cout<<" "<<T[i][2][j];
cout<<endl;
}
int main(){
//reopen("in.txt","r",stdin);
//reopen("out.txt","w",stdout);
int N;
cin>>N;
for(int kase=0;kase<N;kase++){
flag=1;
memset(d,0,sizeof(d));
for(int i=0;i<maxn;i++)
G[i].clear();
Q.clear();
for(int i=0;i<maxn;i++)
for(int j=0;j<3;j++)
T[i][j].clear();
memset(a,0,sizeof(a));
memset(id,0,sizeof(id));
int n;
cin>>n;
for(int i=1;i<=n;i++){
for(;;){
int j;
cin>>j;
if(j!=0)
d[i][j]=1;
else break;
}
}
for(int i=1;i<=n;i++)
for(int j=i+1;j<=n;j++){
if(d[i][j]*d[j][i]==0){
G[i].push_back(j);
G[j].push_back(i);
}
}
int FLAG=1;
cnt=0;
for(int i=1;i<=n;i++){
memset(t,0,sizeof(t));
if(id[i]==0){
if(dfs(i)){
Q.push_back(t[2]-t[0]);
cnt++;
}
else {
FLAG=0;
break;
}
}
}
if(n==1) FLAG=0;
if(FLAG){
for(int j=Q.size()-1;j>=0;j--){
if(j==Q.size()-1){
a[j]=Q[j];
}
else{
if(abs(Q[j]+a[j+1])<abs((-1)*Q[j]+a[j+1])){
a[j]=Q[j]+a[j+1];
}
else {
a[j]=(-1)*Q[j]+a[j+1];
swap(T[j][0],T[j][2]);
}
}
}
print();
}
else cout<<"No solution"<<endl;
if(kase!=N-1) cout<<endl;
}
return 0;
}
9.5-uva-1627-Team them up-動態規劃-圖-連通分量-DFS(WA)
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.