http://acm.timus.ru/problem.aspx?space=1&num=1128
思维才是最重要的 有些题目用不到很复杂的算法 甚至不用算法 但就是让人很难想到
个人认为这才是一个人能力的关键 还需要多加练习呀
此题:
首先 此题肯定有解 也就是说“NO SOLUTION”是骗人的
1.我们先把所以人放在一个组里
2.遍历一遍 对于某个人如果同组中有两个或两个以上的敌人 则将此人放到另一组
3.如果 2 中没有更新则结束 否则重复 步骤 2
时间复杂度 接近 o(n^2)
可以接受
代码:
#include<iostream> #include<cstdio> #include<cstring> #include<cmath> #include<algorithm> #include<vector> #include<set> #include<queue> #include<stack> #include<map> #include<string> #include<iomanip> using namespace std; #define LL long long const int INF=0x3f3f3f3f; const int N=10005; int head[N],I; struct node { int j,next; }side[N*50]; vector<int>group1; vector<int>group2; int in[N]; queue<int>qt; struct node1 { int out; int I; }mem[N]; void add(int i,int j) { side[I].j=j; side[I].next=head[i]; head[i]=I++; } bool cmp(node1 x,node1 y) { return x.out<y.out; } bool F(int k,int n) { bool log=false; for(int i=1;i<=n;++i) { if(in[i]==k) { int k=0; for(int t=head[i];t!=-1;t=side[t].next) { int l=side[t].j; if(in[l]==in[i]) ++k; } if(k>=2) {in[i]=-in[i];log=true;} } } return log; } int main() { //freopen("data.in","r",stdin); int n; while(cin>>n) { memset(head,-1,sizeof(head)); I=0; for(int i=1;i<=n;++i) { int m; cin>>m; while(m--) { int k; cin>>k; add(i,k); } } for(int i=1;i<=n;++i) in[i]=1; int k=1; while(F(k,n)) k=-k; group1.clear(); group2.clear(); for(int i=1;i<=n;++i) { if(in[i]==1) group1.push_back(i); else group2.push_back(i); } cout<<min(group1.size(),group2.size())<<endl; if(group1.size()<group2.size()||(group1.size()==group2.size()&&group1[0]==1)) for(unsigned int i=0;i<group1.size();++i) { if(i) cout<<" "; cout<<group1[i]; } else for(unsigned int i=0;i<group2.size();++i) { if(i) cout<<" "; cout<<group2[i]; } } return 0; }