Online Judge | Problem Set | Authors | Online Contests | User | ||||||
---|---|---|---|---|---|---|---|---|---|---|
Web Board Home Page F.A.Qs Statistical Charts | Current Contest Past Contests Scheduled Contests Award Contest |
1次AC,人懒,用的STL,276K 219MS#include <iostream> #include <stdio.h> #include <vector> #include <queue> using namespace std; int main() { bool brs[101][101] = {false};//双向记不认识的为true bool rs[101][101] = {false};//单向认识 vector<int> brsdr[101];//记录每个人不认识的人 int N; scanf("%d", &N); for(int i = 1; i <= N; i++){ int temp; while(1){ scanf("%d", &temp); if(temp == 0) break; rs[i][temp] = true; } } for(int i = 1; i <= N-1; i++){ for(int j = i+1; j <= N; j++){ //if(i == j) continue; if(!rs[i][j] || !rs[j][i]){ brs[i][j] = true; brs[j][i] = true; brsdr[i].push_back(j); brsdr[j].push_back(i); } } } //vector<int> ltfz[100]; vector<int> yiIdx[100], fuyiIdx[100]; int yigs[100] = {0}, fuyigs[100] = {0}; int ltfzgs = 0;//连通分支个数 int used[101] = {0};//0表示木有加入连通分支,1,-1表示两个子集 //bool keyi = true; for(int i = 1; i <= N; i++){ if(used[i] != 0) continue; used[i] = 1; yigs[ltfzgs] ++; yiIdx[ltfzgs].push_back(i); //ltfz[ltfzgs].push_back(i); queue<int> bfs; bfs.push(i); while(!bfs.empty()){ int top = bfs.front(); bfs.pop(); int gs = brsdr[top].size(); for(int j = 0; j < gs; j++){ int idx = brsdr[top][j]; if(used[idx] != 0) continue; bfs.push(idx); //ltfz[ltfzgs].push_back(idx); used[idx] = -used[top]; if(used[idx] == 1){ yigs[ltfzgs] ++; yiIdx[ltfzgs].push_back(idx); } else{ fuyigs[ltfzgs] ++; fuyiIdx[ltfzgs].push_back(idx); } } } int sz = yiIdx[ltfzgs].size(); for(int ii = 0; ii < sz-1; ii++){ for(int j = ii+1; j < sz; j++){ int idx1 = yiIdx[ltfzgs][ii], idx2 = yiIdx[ltfzgs][j]; if(brs[idx1][idx2]){ cout << "No solution" << endl; return 0+0; } } } sz = fuyiIdx[ltfzgs].size(); for(int ii = 0; ii < sz-1; ii++){ for(int j = ii+1; j < sz; j++){ int idx = fuyiIdx[ltfzgs][ii], idx2 = fuyiIdx[ltfzgs][j]; if(brs[idx][idx2]){ cout << "No solution" << endl; return 0-0; } } } ltfzgs ++; } bool gss[102][102] = {false}; bool trace[102][102]; gss[0][0] = true; for(int i = 0; i < ltfzgs; i++){ for(int j = 0; j <= N/2; j++){ if(j >= yigs[i] && gss[i][j-yigs[i]]){ gss[i+1][j] = true; trace[i+1][j] = true; } else if(j >= fuyigs[i] && gss[i][j-fuyigs[i]]){ gss[i+1][j] = true; trace[i+1][j] = false; } } } int arg = -1; for(int i = N/2; i >= 0; i--){ if(gss[ltfzgs][i]){ arg = i; break; } } int Arg = arg; bool zfs[102]; for(int i = ltfzgs; i > 0; i--){ zfs[i-1] = trace[i][arg]; if(i == 1) break; if(zfs[i-1]){ arg -= yigs[i-1]; } else{ arg -= fuyigs[i-1]; } } printf("%d", Arg); for(int i = 0; i < ltfzgs; i++){ if(zfs[i]){ for(int j = 0; j < yigs[i]; j++){ printf(" %d", yiIdx[i][j]); } } else{ for(int j = 0; j < fuyigs[i]; j++){ printf(" %d", fuyiIdx[i][j]); } } } printf("\n"); printf("%d", N-Arg); for(int i = 0; i < ltfzgs; i++){ if(zfs[i]){ for(int j = 0; j < fuyigs[i]; j++){ printf(" %d", fuyiIdx[i][j]); } } else{ for(int j = 0; j < yigs[i]; j++){ printf(" %d", yiIdx[i][j]); } } } printf("\n"); return 0; } Followed by: Post your reply here: |
All Rights Reserved 2003-2013 Ying Fuchen,Xu Pengcheng,Xie Di
Any problem, Please Contact Administrator