关闭

bzoj1934 [Shoi2007]Vote 善意的投票(最小割)

49人阅读 评论(0) 收藏 举报
分类:

s向1的点建边,容量为1,0的点向T建边,容量为1,对于所有朋友关系:如果原来意见相同,就建双向边,容量为1,否则建边由1指向0,容量为1。最小割就是答案。最后s集合都是1,T集合都是0.

#include <cstdio>
#include <cstring>
#include <algorithm>
#include <queue>
using namespace std;
#define ll long long
#define inf 0x3f3f3f3f
#define N 310
inline int read(){
    int x=0,f=1;char ch=getchar();
    while(ch<'0'||ch>'9'){if(ch=='-')f=-1;ch=getchar();}
    while(ch>='0'&&ch<='9') x=x*10+ch-'0',ch=getchar();
    return x*f;
}
int n,m,col[N],h[N],num=1,T=301,lev[N],ans=0,cur[N];
struct edge{
    int to,next,val;
}data[91000];
inline void add(int x,int y,int val,int op){
    data[++num].to=y;data[num].next=h[x];h[x]=num;data[num].val=val;
    data[++num].to=x;data[num].next=h[y];h[y]=num;data[num].val=val*op;
}
inline bool bfs(){
    queue<int>q;memset(lev,0,sizeof(lev));
    lev[0]=1;q.push(0);
    while(!q.empty()){
        int x=q.front();q.pop();
        for(int i=h[x];i;i=data[i].next){
            int y=data[i].to;if(lev[y]||!data[i].val) continue;
            lev[y]=lev[x]+1;q.push(y);
        }
    }return lev[T];
}
inline int dinic(int x,int low){
    if(x==T) return low;int tmp=low;
    for(int i=h[x];i;i=data[i].next){
        int y=data[i].to;if(lev[y]!=lev[x]+1||!data[i].val) continue;
        int res=dinic(y,min(data[i].val,tmp));
        if(!res) lev[y]=0;else tmp-=res,data[i].val-=res,data[i^1].val+=res;
        if(!tmp) return low;
    }return low-tmp;
}
int main(){
//  freopen("a.in","r",stdin);
    n=read();m=read();
    for(int i=1;i<=n;++i){
        col[i]=read();col[i]?add(0,i,1,0):add(i,T,1,0);
    }while(m--){
        int x=read(),y=read();if(col[x]<col[y]) swap(x,y);
        if(col[x]==col[y]) add(x,y,1,1);
        else add(x,y,1,0);
    }while(bfs()){memcpy(cur,h,sizeof(cur));ans+=dinic(0,inf);}
    printf("%d\n",ans);
    return 0;
}
0
0
查看评论
发表评论
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场

bzoj1934【shoi2007】Vote善意的投票

最小割
  • AaronGZK
  • AaronGZK
  • 2015-12-26 00:05
  • 1304

多数投票算法(Boyer-Moore Algorithm)详解

多数投票算法(Boyer-Moore Algorithm)详解
  • kimixuchen
  • kimixuchen
  • 2016-10-11 19:08
  • 2044

VotingClassifier 模型聚合——投票

模型聚合方法——投票实践
  • yanyanyufei96
  • yanyanyufei96
  • 2017-05-05 13:16
  • 1501

[BZOJ1934][Shoi2007]Vote 善意的投票(最小割)

一路走来形单影只 转身回望大家已经远去 即使如此我依然前行 这正是我的坚强
  • Clove_unique
  • Clove_unique
  • 2016-04-28 16:40
  • 574

bzoj1934: [Shoi2007]Vote 善意的投票(最小割)

题目传送门 做网络流快疯了。解法: 好水。。 明显的最小割嘛。。 本来同意的连st容量为1 本来不同意的连ed容量为1。 然后图中的边就互相连嘛。代码实现:#include #includ...
  • Hanks_o
  • Hanks_o
  • 2017-12-29 13:34
  • 46

【bzoj 1934】[Shoi2007]Vote 善意的投票 最小割

【bzoj 1934】[Shoi2007]Vote 善意的投票 最小割
  • pbihao
  • pbihao
  • 2016-10-21 17:25
  • 156

BZOJ1934 [Shoi2007]Vote 善意的投票 【最小割】

题目幼儿园里有n个小朋友打算通过投票来决定睡不睡午觉。对他们来说,这个问题并不是很重要,于是他们决定发扬谦让精神。虽然每个人都有自己的主见,但是为了照顾一下自己朋友的想法,他们也可以投和自己本来意愿相...
  • qq_38678604
  • qq_38678604
  • 2017-12-24 14:26
  • 67

【BZOJ 1934】 [Shoi2007]Vote 善意的投票

最小割建模典型题~
  • Regina8023
  • Regina8023
  • 2015-03-17 17:31
  • 730

bzoj1934【shoi2007】Vote善意的投票

最小割
  • AaronGZK
  • AaronGZK
  • 2015-12-26 00:05
  • 1304

[bzoj1934][网络流-最小割]Vote 善意的投票

Description 幼儿园里有n个小朋友打算通过投票来决定睡不睡午觉。对他们来说,这个问题并不是很重要,于是他们决定发扬谦让精神。虽然每个人都有自己的主见,但是为了照顾一下自己朋友的想法,他们...
  • Rose_max
  • Rose_max
  • 2017-12-28 20:47
  • 285
    个人资料
    • 访问:55117次
    • 积分:6692
    • 等级:
    • 排名:第4119名
    • 原创:635篇
    • 转载:6篇
    • 译文:0篇
    • 评论:15条
    欢迎神犇勾搭~~~
    QQ:1104161801