9.5-uva-1627-Team them up-動態規劃-圖-連通分量-DFS(WA)

#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;
}

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章