Ural1109 Conference(二分图匹配)

来源:互联网 发布:一个顶级域名多少钱 编辑:程序博客网 时间:2024/06/06 13:17

题目大意:每个顶点要求至少连一条边,求覆盖完全部顶点的最少边数


思路:二分图匹配的模板题,每个顶点被一条边覆盖,则要用N+M条边。但每条匹配的边却覆盖着2个顶点,就少用1条边。因此,最多可以少用的边数恰等于最大匹配数。故有:
                                                     最少边数 = N + M - 最大匹配数

#include<cstdio>#include<cstring>using namespace std;int n,m,k;int cx[1010],cy[1010];bool vis[1010];struct T{int v;int next;}edge[101000];int cnt;int head[1010];void add_edge(int u,int v){edge[cnt].v = v;edge[cnt].next = head[u];head[u] = cnt++;}bool dfs(int u){for(int i = head[u]; i != -1; i = edge[i].next){int v = edge[i].v;if(!vis[v]){vis[v] = 1;if(cy[v] == -1||dfs(cy[v])){cy[v] = u;cx[u] = v;return true;}}}return false;}int maxmatch(){int res = 0;memset(cx,-1,sizeof cx);memset(cy,-1,sizeof cy);for(int i = 1; i <= n; i++){if(cx[i] == -1){memset(vis,0,sizeof vis);if(dfs(i)) res++;}}return res;}int main(){while(scanf("%d%d%d",&n,&m,&k) != EOF){memset(head,-1,sizeof head);for(int i = 1; i <= k; i++){int a,b;scanf("%d%d",&a,&b);add_edge(a,b);}printf("%d\n",n+m-maxmatch());}}


0 0