标签:cstring main find lap 更新 stack eval lib can
最小定点覆盖是指这样一种情况:
图G的顶点覆盖是一个顶点集合V,使得G中的每一条边都接触V中的至少一个顶点。我们称集合V覆盖了G的边。最小顶点覆盖是用最少的顶点来覆盖所有的边。顶点覆盖数是最小顶点覆盖的大小。
相应地,图G的边覆盖是一个边集合E,使得G中的每一个顶点都接触E中的至少一条边。如果只说覆盖,则通常是指顶点覆盖,而不是边覆盖。
在二分图中:最大匹配数=最小顶点覆盖数;
Input
4 0:(1) 1 1:(2) 2 3 2:(0) 3:(0) 5 3:(3) 1 4 2 1:(1) 0 2:(0) 0:(0) 4:(0)
Output
1 2
Sample Input
4 0:(1) 1 1:(2) 2 3 2:(0) 3:(0) 5 3:(3) 1 4 2 1:(1) 0 2:(0) 0:(0) 4:(0)
题意:找该图的最小顶点覆盖数
题解:二分图匹配vector存图,貌似用邻接矩阵会超时(好像还可以用树形dp做,等学了再来更新做法!)
#include<map> #include<set> #include<cmath> #include<queue> #include<stack> #include<vector> #include<cstdio> #include<cstdlib> #include<cstring> #include<iostream> #include<algorithm> #define pi acos(-1) #define ll long long #define mod 1000000007 using namespace std; const int N=1500+5,maxn=100+5,inf=0x3f3f3f3f; int color[N]; bool used[N]; vector<int>v[N]; bool match(int x) { for(int i=0;i<v[x].size();i++) { int t=v[x][i]; if(!used[t]) { used[t]=1; if(color[t]==-1||match(color[t])) { color[t]=x; return 1; } } } return 0; } int main() { int n; while(cin>>n){ for(int i=0;i<n;i++)v[i].clear(); for(int i=0;i<n;i++) { int a,b,k; scanf("%d:(%d)",&a,&b); while(b--){ cin>>k; v[a].push_back(k); v[k].push_back(a); } } int ans=0; memset(color,-1,sizeof color); for(int i=0;i<n;i++) { memset(used,0,sizeof used); ans+=match(i); } cout<<ans/2<<endl; } return 0; }
标签:cstring main find lap 更新 stack eval lib can
原文地址:http://www.cnblogs.com/acjiumeng/p/6748773.html