题目链接:http://acm.hust.edu.cn/vjudge/problem/viewProblem.action?id=26913
思路:水题一枚,就是求最大独立集。最大独立集=顶点数-最大匹配。
1 #include<iostream> 2 #include<cstdio> 3 #include<cstring> 4 #include<algorithm> 5 #include<vector> 6 using namespace std; 7 #define MAXN 1111 8 #define FILL(a,b) memset(a,b,sizeof(a)) 9 10 int n,m,ly[MAXN]; 11 bool mark[MAXN]; 12 13 vector<int>g[MAXN]; 14 15 int dfs(int u) 16 { 17 for(int i=0;i<g[u].size();i++){ 18 int v=g[u][i]; 19 if(!mark[v]){ 20 mark[v]=true; 21 if(ly[v]==-1||dfs(ly[v])){ 22 ly[v]=u; 23 return 1; 24 } 25 } 26 } 27 return 0; 28 } 29 30 31 int MaxMatch() 32 { 33 int res=0; 34 FILL(ly,-1); 35 for(int i=1;i<=n;i++){ 36 FILL(mark,false); 37 res+=dfs(i); 38 } 39 return res/2; 40 } 41 42 int main() 43 { 44 int _case,u,v,t=1; 45 scanf("%d",&_case); 46 while(_case--){ 47 scanf("%d%d",&n,&m); 48 for(int i=0;i<=n;i++)g[i].clear(); 49 while(m--){ 50 scanf("%d%d",&u,&v); 51 g[u].push_back(v); 52 g[v].push_back(u); 53 } 54 printf("Case %d: %d ",t++,n-MaxMatch()); 55 } 56 return 0; 57 }