zoukankan      html  css  js  c++  java
  • 题解 UVA12168 【Cat vs. Dog】

    题目链接

    Solution UVA12168 Cat vs. Dog

    题目大意:给定(n)个人,有(c)只猫和(d)只狗.每个人会喜欢一只猫/狗,并且讨厌一只狗/猫.求一种方案让尽可能多的人满意(喜欢的动物出现,讨厌的不出现)

    二分图最大点独立集


    分析:这不就是二分图最大点独立集的模板吗.如果
    (u)喜欢的是(v)讨厌的或者(u)讨厌的是(v)喜欢的,就要连边((u,v))因为只有喜欢不同动物的人才可能有连边,所以这个图是二分图

    两个人之间没有连边就代表他们的要求可以同时满足(都满意),跑一次二分图最大点独立集即可

    注意毒瘤的输入!!!以及连边的顺序(要么猫爱好者连狗爱好者,要么反之)

    #include <iostream>
    #include <cstdio>
    #include <string>
    #include <cstring>
    #include <queue>
    #include <algorithm>
    using namespace std;
    const int INF = 0x7fffffff;
    const int maxn = 1024;
    const int maxm = (1024 * 1024 + 2048) << 1;
    struct Edge{
    	int from,to,cap,flow;
    	Edge() = default;
    	Edge(int a,int b,int c,int d):from(a),to(b),cap(c),flow(d){}
    }Edges[maxm];
    int head[maxn],nxt[maxm],tot = 1;
    inline void clear(){
    	memset(head,0,sizeof(head));
    	memset(nxt,0,sizeof(nxt));
    	tot = 1;
    }
    inline void addedge(int from,int to,int cap){
    	Edges[++tot] = Edge(from,to,cap,0);
    	nxt[tot] = head[from];
    	head[from] = tot;
    	Edges[++tot] = Edge(to,from,0,0);
    	nxt[tot] = head[to];
    	head[to] = tot;
    }
    int d[maxn];
    inline bool bfs(int s,int t){
    	memset(d,-1,sizeof(d));
    	d[s] = 0;
    	queue<int> Q;
    	Q.push(s);
    	while(!Q.empty()){
    		int u = Q.front();Q.pop();
    		for(int i = head[u];i;i = nxt[i]){
    			Edge &e = Edges[i];
    			if(e.cap > e.flow && d[e.to] == -1){
    				d[e.to] = d[u] + 1;
    				Q.push(e.to);
    			}
    		}
    	}
    	return d[t] != -1;
    }
    int cur[maxn];
    inline int dfs(int u,int a,int t){
    	if(u == t || a == 0)return a;
    	int ret = 0,f;
    	for(int &i = cur[u];i;i = nxt[i]){
    		Edge &e = Edges[i];
    		if(d[u] + 1 == d[e.to] && (f = dfs(e.to,min(a,e.cap - e.flow),t)) > 0){
    			ret += f;
    			Edges[i].flow += f;
    			Edges[i ^ 1].flow -= f;
    			a -= f;
    			if(a == 0)break;
    		}
    	}
    	return ret;
    }
    inline int maxflow(int s,int t){
    	int ret = 0;
    	while(bfs(s,t)){
    		memcpy(cur,head,sizeof(head));
    		ret += dfs(s,0x7fffffff,t);
    	}
    	return ret;
    }
    struct Person{
    	string like,hate;
    }person[maxn];
    int t,cat,dog,n,cnt;
    inline void solve(){
    	clear();
    	cin >> cat >> dog >> n;
    	for(int i = 1;i <= n;i++){
    		cin >> person[i].like >> person[i].hate;
    	}
    	int s = n + n + 1,t = n + n + 2;
    	for(int i = 1;i <= n;i++)
    		for(int j = 1;j <= n;j++)
    			if((person[i].like[0] != person[j].like[0]) && (person[i].like == person[j].hate || person[i].hate == person[j].like)){
    				if(person[i].like[0] == 'C')addedge(i,j + n,1);
    				else if(person[j].like[0] == 'C')addedge(j,i + n,1);
    			}
    	for(int i = 1;i <= n;i++)
    		if(person[i].like[0] == 'C')
    			addedge(s,i,1);
    	for(int i = 1;i <= n;i++)
    		if(person[i].like[0] == 'D')
    			addedge(i + n,t,1);
    	cout << n - maxflow(s,t) << endl;
    }
    int main(){
    #ifdef LOCAL
    	freopen("fafa.in","r",stdin);
    	freopen("fafa.out","w",stdout);
    #else
    	ios::sync_with_stdio(false);
    #endif
    	cin >> t;
    	while(t--)
    		solve();
    	return 0;
    }
    
  • 相关阅读:
    oracle 存储过程 技巧
    任何用户密码都能以sysdba角色登入
    DBA操作常用命令
    事务 脏数据
    Axis2 WebService(配置、发布、调用)
    C#接口
    纯CSS3实现的一些酷炫效果
    C#运算符大全_各种运算符号的概述及作用
    mvc图片上传到服务器
    C# .NET 基本概念
  • 原文地址:https://www.cnblogs.com/colazcy/p/11515017.html
Copyright © 2011-2022 走看看