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

79人阅读 评论(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;
}
查看评论

区块链实战(3):用Solidity实现投票智能合约

本课程是《区块链实战》系列专题的第3个课程。本课程用Solidity语言实现了一个支持投票功能的智能合约。
  • 2018年03月04日 20:23

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

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

bzoj1934【shoi2007】Vote善意的投票

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

[SHOI2007]BZOJ1934 Vote善意的投票-最小割

题目链接:传送门 题目大意:请自行参考原题 题解:我承认如果不告诉我这是个最小割我是想不到的QWQ 一个同学i的意见是x如果x=1就建边(S,i,1)否则建边(i,T,1)。 如果xy是朋友就建边(x...
  • Mys_C_K
  • Mys_C_K
  • 2017-05-12 15:12:36
  • 229

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

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

BZOJ 1934([Shoi2007]Vote 善意的投票-最小割)

1934: [Shoi2007]Vote 善意的投票 Time Limit: 1 Sec  Memory Limit: 64 MB Submit: 612  Solved: 365 [Submi...
  • nike0good
  • nike0good
  • 2013-06-22 15:49:44
  • 1513

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

按公式构图法会发现最难处理的就是另个相邻的点颜色不同怎么处理 然后就是神奇的max(xi-xj,xj-xi) 然后这一题就结束了。#include #include #include #inc...
  • IED98
  • IED98
  • 2015-03-20 10:57:28
  • 347

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

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

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

一上来容易想到缩点dp,但由于一个集合是没法用状态表示的,所以不能dp 然后就可以想到最小割,即通过割边和代价完成分配; 就比较好做了,默认选0就和0连边,默认选1就和1连边,朋友之间连边,如果在...
  • haobang866
  • haobang866
  • 2018-02-02 14:23:22
  • 27

bzoj1934: [Shoi2007]Vote 善意的投票

传送门 看到假题,我们就应该想到网络流。 从S向不睡的人连单向边,流量1 从睡的人向T连单向边,流量1 每对朋友之间连双向边,流量1 大力最小割一发就可以了。#include #includ...
  • zhouyuyang233
  • zhouyuyang233
  • 2017-07-23 17:21:45
  • 103
    个人资料
    持之以恒
    等级:
    访问量: 9万+
    积分: 1万+
    排名: 1874
    文章分类
    文章存档
    最新评论