二分图匹配——BZOJ1191/Luogu2319 [HNOI2006]超级英雄

来源:互联网 发布:淘宝卖蚕丝被 编辑:程序博客网 时间:2024/06/05 21:09

题面:BZOJ1191 Luogu2319
Hungary匹配算法
思路同“[SCOI2010]连续攻击游戏”详见传送门
然后呢就是建边不一样一点,其他都差不多是一样的
注意到Luogu因为有SPJ,所以要求输出方案
其实很简单啊,就是在DFS时候记录的匹配对象就是啦~
把这个输出就好了

#include<cstring>#include<cstdio>#include<algorithm>#include<cmath>#include<iostream>#include<cstdlib>#include<climits>#include<string>#include<queue>using namespace std;int n,m,vis[20001],pp[20001];int nedge=0,p[40001],nex[40001],head[40001];inline void addedge(int a,int b){    p[++nedge]=b;nex[nedge]=head[a];head[a]=nedge;}bool dfs(int x,int y){    for(int k=head[x];k;k=nex[k])if(vis[p[k]]!=y){        vis[p[k]]=y;        if(!pp[p[k]]||dfs(pp[p[k]],y)){            pp[x]=p[k];            pp[p[k]]=x;            return 1;        }    }    return 0;}inline void hungary(){    int ans=0;    for(int i=1;i<=n+1;i++)if(dfs(i,i))ans++;    else break;    printf("%d\n",ans);    for(int i=1;i<=ans;i++)printf("%d\n",pp[i]-10001);//洛谷SPJ要求输出方案BZOJ这句话不用}int main(){    scanf("%d%d",&n,&m);    for(int i=0;i<m;i++){        int x,y;scanf("%d%d",&x,&y);        addedge(i+1,x+10001);addedge(i+1,y+10001);        addedge(x+10001,i+1);addedge(y+10001,i+1);    }    hungary();    return 0;}
原创粉丝点击