题意:求二分图的最大独立集(独立集就是图中任意两个顶点都不相连的顶点集合)
思路:交替染色法,两种颜色把图染色。颜色最多的即为最大独立集。
#include<iostream> #include<cstdio> #include<cstring> #include<cstdlib> #include<algorithm> #include<queue> #include<set> #include<map> #include<vector> #include<cmath> #define ll __int64 #define INF 0x3fffffff using namespace std; vector<vector<int> >G(1005); int a[1005]; int vis[1005]; int n; int tm[1005]; int Max=0; int is_prime(int m) { int k=sqrt(m); if(m==2||m==3) return 1; else for(int i=2;i<=k;i++) if(m%i==0) return 0; return 1; } void dfs(int x,int color) { if(x==n-1) return; vis[x]=1; for(int i=0;i<G[x].size();i++){ int e=G[x][i]; if(!vis[e]){ if(tm[e]==0){ tm[e]=-color; color=-color; dfs(e,color); } } } } int main() { //freopen("d:\\Test.txt","r",stdin); int T; int t=1; cin>>T; while(T--){ scanf("%d",&n); for(int i=0;i<n;i++){ scanf("%d",&a[i]); } for(int i=0;i<1005;i++) G[i].clear(); sort(a,a+n); int m=0; for(int i=0;i<n;i++){ for(int j=i+1;j<n;j++){ if(a[j]%a[i]==0){ if(is_prime(a[j]/a[i])){ G[i].push_back(j); m++; } } } } int ans=0; memset(tm,0,sizeof(tm)); memset(vis,0,sizeof(vis)); for(int i=0;i<n;i++){ if(tm[i]==0&&!vis[i]){ tm[i]=-1; dfs(i,-1); } } int t1=0,t2=0; for(int i=0;i<n;i++){ if(tm[i]==-1) t1++; if(tm[i]==1) t2++; } //cout<<t1<<" "<<t2<<endl; ans=max(t1,t2); cout<<"Case #"<<t++<<": "<<ans<<endl; } return 0; }
原文地址:http://blog.csdn.net/u012198382/article/details/45285943