1. 程式人生 > >[二分圖最大獨立集]BZOJ 1143—— [CTSC2008]祭祀river

[二分圖最大獨立集]BZOJ 1143—— [CTSC2008]祭祀river

題目梗概

給定一張有向圖,在這個圖上的一些節點放上標記且任意標記節點不被其他標記節點到達。

使標記節點個數最大化。

解題思路

對於每一個點還是進行拆點操作,這樣就形成一張二分圖。

題目答案顯然就是二分圖的最大獨立集。

最大獨立集=n-最小頂點覆蓋,不懂戳這

#include<cstdio>
#include<cstring>
using namespace std;
const int maxn=105,maxm=1005;
int n,m,lnk[maxn],f[maxn],ans,tot,tim,vis[maxn],c[maxn][maxn];

bool find(int x){
    for (int i=1;i<=n;i++)
if (c[x][i]&&vis[i]!=tim){ vis[i]=tim; if (!f[i]||find(f[i])){ f[i]=x; return 1; } } return 0; } int main(){ freopen("exam.in","r",stdin); freopen("exam.out","w",stdout); scanf("%d%d",&n,&m); for (int i=1,x,y;i<=m;i++){
scanf("%d%d",&x,&y); c[x][y]=1; } for (int k=1;k<=n;k++) for (int i=1;i<=n;i++) for (int j=1;j<=n;j++) c[i][j]=c[i][j]|(c[i][k]&c[k][j]); for (int i=1;i<=n;i++){ tim++; if (find(i)) ans++; } printf("%d\n",n-ans);
return 0; }