二分圖最大獨立集
阿新 • • 發佈:2019-02-19
最大獨立集
思路:用匈牙利演算法算出二分圖的最大匹配數,然後求得最大獨立集=節點數-二分圖最大匹配數/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;
}