传送门:A Perfect Murder
题意:有一群苍蝇,之间有一些是朋友关系,如果杀了一只苍蝇,那么它的朋友们都会有警惕性,再也杀不了这些朋友了,问最多能杀多少只苍蝇。
分析:根据朋友性连边,最多能杀多少只苍蝇非朋友关系,题目就是求一个裸最大独立集。
#include <cstdio> #include <cstring> #include <string> #include <cmath> #include <iostream> #include <algorithm> #include <queue> #include <cstdlib> #include <stack> #include <vector> #include <set> #include <map> #define LL long long #define mod 100000000 #define inf 0x3f3f3f3f #define eps 1e-6 #define N 1010 #define FILL(a,b) (memset(a,b,sizeof(a))) #define lson l,m,rt<<1 #define rson m+1,r,rt<<1|1 #define PII pair<int,int> using namespace std; int match[N],vis[N],n,m; vector<int>g[N]; int dfs(int u) { for(int i=0,sz=g[u].size(); i<sz; i++) { int v=g[u][i]; if(!vis[v]) { vis[v]=1; if(match[v]==-1||dfs(match[v])) { match[v]=u; return 1; } } } return 0; } int hungary() { FILL(match,-1); int ans=0; for(int i=1; i<=n; i++) { FILL(vis,0); if(dfs(i))ans++; } return ans; } int main() { int T,u,v,cas=1; scanf("%d",&T); while(T--) { scanf("%d%d",&n,&m); for(int i=1; i<=n; i++) g[i].clear(); for(int i=1; i<=m; i++) { scanf("%d%d",&u,&v); g[u].push_back(v); g[v].push_back(u); } int res=hungary(); printf("Case %d: %d ",cas++,n-res/2); } }