标签:== mes AC ice nta lines ber plm inline
Time Limit: 1000MS | Memory Limit: 65536K | |
Total Submissions: 25270 | Accepted: 13635 |
Description
Input
Output
Sample Input
3 4 1 1 1 3 2 2 3 2
Sample Output
2
Hint
Source
//题意:有一个n*n的矩阵,上面有m个黑格子 // 现在有一把刷子,可以将一行或一列上的黑格子刷成白色 // 问最少需要几刷子可以让矩阵变成全白 // 格子不是黑的就是白的 //用横坐标和纵坐标建立二分图,如果有黑格子在(x,y) //那么就让左侧x连向右侧y //那么我们就可以得到同行和同列的格子的个数 //然后求最小点覆盖就可以了 //最小点覆盖=最大匹配数 #include<iostream> #include<cstdio> #include<cstring> #include<cmath> #include<algorithm> using namespace std; inline int read() { char c=getchar();int num=0; for(;!isdigit(c);c=getchar()); for(;isdigit(c);c=getchar()) num=num*10+c-‘0‘; return num; } const int M=1e4+5; int n,m; int match[M]; int vis[M],tim; int head[M],num_edge; struct Edge { int v,nxt; }edge[M]; void add_edge(int u,int v) { edge[++num_edge].v=v; edge[num_edge].nxt=head[u]; head[u]=num_edge; } bool dfs(int u) { for(int i=head[u],v;i;i=edge[i].nxt) { v=edge[i].v; if(vis[v]==tim) continue; vis[v]=tim; if(!match[v]||dfs(match[v])) { match[v]=u; return 1; } } return 0; } int main() { n=read(),m=read(); for(int i=1,x,y;i<=m;++i) { x=read(),y=read(); add_edge(x,y); } int ans=0; for(int i=1;i<=n;++i) { ++tim; ans+=dfs(i); } printf("%d",ans); return 0; }
标签:== mes AC ice nta lines ber plm inline
原文地址:https://www.cnblogs.com/lovewhy/p/9029361.html