1. 程式人生 > >四川第七屆 D Vertex Cover(二分圖最小點覆蓋,二分匹配模板)

四川第七屆 D Vertex Cover(二分圖最小點覆蓋,二分匹配模板)

etc 模板 push_back cst rst red nes http main

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 (2n500,1mn(n?1)22≤n≤500,1≤m≤n(n?1)2). Each of the following mm lines contains 22 integers ai,biai,bi (1ai,bin,aibi,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<cstdio>
#include<string.h>
#include<vector>
#include<queue>
#include<stack>
#include
<cmath> #include<iostream> #include<algorithm> #include<deque> using namespace std; #define ll unsigned long long vector<int>v[505]; int match[505]; bool used[505]; bool dfs(int x) { used[x]=1;//標記詢問過了 for(int i=0;i<v[x].size();i++) { int y=v[x][i]; int w=match[y]; if(w<0||!used[w]&&dfs(w)) {//如果它沒有匹配過或者(沒有問過而且可以找到其它) match[x]=y; match[y]=x; return 1; } } return 0; } int main() { int n,m; while(cin>>n>>m) { for(int i=0;i<=502;i++) v[i].clear(); for(int i=1;i<=m;i++) { int x,y; cin>>x>>y; v[x].push_back(y); v[y].push_back(x); } int res=0; memset(match,-1,sizeof(match)); for(int i=1;i<=n;i++) { if(match[i]<0)//還沒匹配 { memset(used,0,sizeof(used));//每次都要初始化 if(dfs(i)) //如果能匹配 res++; } } } cout<<res<<endl; } return 0; }

四川第七屆 D Vertex Cover(二分圖最小點覆蓋,二分匹配模板)