1. 程式人生 > >二分圖最大獨立集

二分圖最大獨立集

最大獨立集

思路:用匈牙利演算法算出二分圖的最大匹配數,然後求得最大獨立集=節點數-二分圖最大匹配數/2;

二分圖最大匹配數程式碼如下

#include <iostream>
#include <cstring>

using namespace std;
int G[555][555];
int visit[555],girl[555];
int n,k;
bool dfs(int x)
{
    for(int i=1;i<=n;i++)
    {
        if(G[x][i]&&!visit[i])
        {
            visit[i]=1
; if(!girl[i]||dfs(girl[i])) { girl[i]=x; return true; } } } return false; } int main() { //int n,k; cin>>n>>k; memset(G,0,sizeof(G)); for(int i=0;i<k;i++) { int x,y; cin
>>x>>y; G[x][y]=1; } int sum=0; for(int i=1;i<=n;i++) { memset(visit,0,sizeof(visit)); if(dfs(i)) sum++; } cout<<sum<<endl; return 0; }

此題最大獨立集程式碼如下

#include <iostream>
#include <cstring>
#include <string>
#include <cstdio> using namespace std; int G[555][555]; int visit[555],girl[555]; int n; bool dfs(int x) { for(int i=1; i<=n; i++) { if(G[x][i]&&!visit[i]) { visit[i]=1; if(girl[i]==0||dfs(girl[i])) { girl[i]=x; return true; } } } return false; } int main() { //int n; while(cin>>n) { memset(G,0,sizeof(G)); //cin>>s; int sum; for(int i=1; i<=n; i++) { sum=0; string s; getchar(); getline(cin,s); //cout<<"s="<<s<<endl; int k; for(int p=0; p<s.size(); p++) { if(s[p]==')') { k=p; break; } } if(k!=s.size()) { for(int p=k+2; p<s.size(); p++) { if(s[p]!=' ') { sum=sum*10+s[p]-'0'; } else { G[i][sum+1]=1; sum=0; } } G[i][sum+1]=1; //cout<<"*sum="<<sum<<endl; //cout<<"*"<<G[i][sum+1]<<endl; } } int ans=0; memset(girl,0,sizeof(girl)); for(int i=1; i<=n; i++) { memset(visit,0,sizeof(visit)); if(dfs(i)) ans++; //cout<<"*ans="<<ans<<endl; } cout<<n-ans/2<<endl; } return 0; }