Vertex Cover
frog has a graph with nn vertices v(1),v(2),…,v(n)v(1),v(2),…,v(n) and mm edges (v(a1),v(b1)),(v(a2),v(b2)),…,(v(am),v(bm))(v(a1),v(b1)),(v(a2),v(b2)),…,(v(am),v(bm)).
She would like to color some vertices so that each edge has at least one colored vertex.
Find the minimum number of colored vertices.
Input
The input consists of multiple tests. For each test:
The first line contains 22 integers n,mn,m (2≤n≤500,1≤m≤n(n−1)22≤n≤500,1≤m≤n(n−1)2). Each of the following mm lines contains 22 integers ai,biai,bi (1≤ai,bi≤n,ai≠bi,min{ai,bi}≤301≤ai,bi≤n,ai≠bi,min{ai,bi}≤30)
Output
For each test, write 11 integer which denotes the minimum number of colored vertices.
Sample Input
3 2
1 2
1 3
6 5
1 2
1 3
1 4
2 5
2 6
Sample Output
1
2
题目大意:有n个点,m条边,每条边最少有一个点上色,问最少需要个多少个点上色
思路:最小点覆盖 ==最大二分图匹配 匈牙利算法模板
代码:
#include<stdio.h>
#include<string.h>
#include<algorithm>
#include<vector>
using namespace std;
const int N=10005;
vector<int>e[N];
int vis[N],ma[N];
int find(int x)
{
for(int i=0;i<e[x].size();i++)
{
int v=e[x][i];
if(!vis[v])
{
vis[v]=1;
if(ma[v]==0||find(ma[v]))
{
ma[v]=x;
return 1;
}
}
}
return 0;
}
int main()
{
int n,m;
while(~scanf("%d%d",&n,&m))
{
memset(ma,0,sizeof(ma));
for(int i=0;i<=n;i++) e[i].clear();
int x,y;
for(int i=0;i<m;i++)
{
scanf("%d%d",&x,&y);
e[x].push_back(y);
e[y].push_back(x);
}
int ans=0;
for(int i=1;i<=n;i++)
{
memset(vis,0,sizeof(vis));
if(find(i)) ans++;
}
printf("%d\n",ans/2);
}
return 0;
}