[BZOJ1934]SHOI2007 Vote|最小割

原创 2015年04月18日 11:13:43

一开始就觉得是最小割转最大流做,,没想出怎么建图。。其实也挺显然,将S向所有1的人连边,所有0的人像T连边,有边的连起双向边,对于一条ST的路径SuvT,割掉S-u表示u违背自己,代价为1,割掉u-v表示朋友冲突,代价为1,割掉v-T表示v违背自己,代价为1,所以就是最小割。。

#include<iostream>
#include<cstdio>
#define N 305
#define M 100005
#define inf 99999999
using namespace std;
struct edge{
  int e,f,next;
}ed[M];
int n,m,q,s,e,ne=1,nd,i,a[N],d[N],u[N],que[N];
void add(int s,int e,int f)
{
  ed[++ne].e=e;ed[ne].f=f;
  ed[ne].next=a[s];a[s]=ne;
}
bool bfs(int s,int t)
{
  int i,j,head=1,tail=1,get,to;
  for (i=0;i<=nd;i++) u[i]=d[i]=0;
  que[1]=s;u[s]=1;
  while (head<=tail)
	{
	  get=que[head++];
	  for (j=a[get];j;j=ed[j].next)
		if (ed[j].f&&!u[to=ed[j].e])
		  {
			d[to]=d[get]+1;
			que[++tail]=to;
			u[to]=1;
		  }
	}
	  return d[t]!=0;
}
  int extend(int x,int minf,int t)
  {
	int f=minf,del,j;
	if (x==t) return minf;
	for (j=a[x];j;j=ed[j].next)
	  if (ed[j].f&&d[ed[j].e]==d[x]+1)
		{
		  del=extend(ed[j].e,min(minf,ed[j].f),t);
		  ed[j].f-=del;ed[j^1].f+=del;
		  minf-=del;
		  if(!minf) break;
		}
	if (f==minf) d[x]=0;
	return f-minf;
  }
  int dinic(int s,int t)
  {
	int ans=0;
	while (bfs(s,t)) ans+=extend(s,inf,t);
	return ans;
  }
int main()
{
  scanf("%d%d",&n,&m);
  nd=n+1;
  for (i=0;i<=nd;i++) a[i]=0;
  for (i=1;i<=n;i++)
	{
	  scanf("%d",&q);
	  if (q) add(0,i,1),add(i,0,0);else add(i,nd,1),add(nd,i,0);
	}
  for (i=1;i<=m;i++)
	{
	  scanf("%d%d",&s,&e);
	  add(s,e,1);add(e,s,1);
	}
  printf("%d\n",dinic(0,nd));
}


[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
  • 164

bzoj1934【shoi2007】Vote善意的投票

最小割
  • AaronGZK
  • AaronGZK
  • 2015年12月26日 00:05
  • 1304

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

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

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

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

【BZOJ1934】【codevs2341】善意的投票,二分图最小割

只要想起一生中后悔的事,梅花便落了下来。
  • xym_CSDN
  • xym_CSDN
  • 2016年05月03日 21:48
  • 176

bzoj1934【shoi2007】Vote善意的投票

最小割
  • AaronGZK
  • AaronGZK
  • 2015年12月26日 00:05
  • 1304

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

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

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

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

1934: [Shoi2007]Vote 善意的投票 (网络流)

1934: [Shoi2007]Vote 善意的投票 如果把每个人都看做一个节点,题意其实就是等价于求把点集划分为2个独立部分的最小代价; 我们把赞成的点都引向汇点一条流量为1的边; 从原点向反...
  • lagoon0o0
  • lagoon0o0
  • 2013年01月04日 22:16
  • 249

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

题目传送门 做网络流快疯了。解法: 好水。。 明显的最小割嘛。。 本来同意的连st容量为1 本来不同意的连ed容量为1。 然后图中的边就互相连嘛。代码实现:#include #includ...
  • Hanks_o
  • Hanks_o
  • 2017年12月29日 13:34
  • 47
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:[BZOJ1934]SHOI2007 Vote|最小割
举报原因:
原因补充:

(最多只允许输入30个字)