(最小割求最小割集)poweroj2883病毒侵染
poweroj2883病毒侵染
思路:
寻找割掉kkk条边,使∏i=1kwi\prod\limits_{i=1}^{k}w_ii=1∏kwi最小,我们可以取对数,即求∑i=1klogwi\sum\limits_{i=1}^{k}\log{w_i}i=1∑klogwi最小,这样就转换成了最小割。但是我们计算答案要寻找割掉的边然后将权值累乘。
可以想到,最小割是指求出权值和最小的边集,使得源点和汇点S,TS,TS,T不连通。再考虑到,如果一条边它是割掉的边,那么它的流量一定为000(反之不成立)。那么我们可以从SSS出发搜索,如果一条边的wiw_iwi为000,就不继续搜索,用vis[1...n]vis[1...n]vis[1...n]记录点是否被搜索过。那么我们能够搜索到的点属于一个点集,没有搜索到的点属于另外一个点集,而这两个点集点相互的连边就属于割掉的边。可以用vis[u]+vis[v]==1vis[u]+vis[v]==1vis[u]+vis[v]==1判断。
代码:
#include<bits/stdc++.h>
#define pii pair<int,int>
#define int long long
#define cl(x,y) memset(x,y,sizeof(x))
#define ct cerr<<"Time elapsed:"<<1.0*clock()/CLOCKS_PER_SEC<<"s.\n";
const int N=5e5+210;
const int mod=1e9+7;
const int inf=0x3f3f3f3f;
const double eps=1e-4;
using namespace std;
struct edge
{int next,u,v,fl;double w;
}maze[N<<1];
int len=1,head[N]={0};
int dep[N];//深度
int vis[N]={0};
void add(int u,int v,int fl,double w)
{maze[++len]={head[u],u,v,fl,w};head[u]=len;
}
void inc(int u,int v,int w)
{double k=log(w);add(u,v,w,k);add(v,u,w,k);
}
double dfs(int u,double f,int t)
{double ans=0;int i;if(u==t)return f;for(i=head[u];i && f;i=maze[i].next){int v=maze[i].v;double w=maze[i].w;if(dep[v]==dep[u]+1 && w)//符合深度关系且能流 {double sum=dfs(v,min(f,w),t);maze[i].w-=sum;maze[i^1].w+=sum;f-=sum;ans+=sum;} }if(!ans)dep[u]=-2; return ans;
}
int bfs(int s,int t)
{queue<int> q;cl(dep,0);dep[s]=1;//源点深度为1q.push(s);while(!q.empty()){int u=q.front(),i;q.pop();for(i=head[u];i;i=maze[i].next){int v=maze[i].v;double w=maze[i].w;if(w && !dep[v])//有深度且能流 {dep[v]=dep[u]+1;q.push(v); }}}return dep[t];
}
void dinic(int s,int t)
{double ans=0;while(bfs(s,t)) ans+=dfs(s,1e9,t);
}
void find(int u)
{vis[u]=1;int i;for(i=head[u];i;i=maze[i].next){int v=maze[i].v;double w=maze[i].w;if(!vis[v] && w)find(v);}
}
signed main()
{ios::sync_with_stdio(false);cin.tie(0);cout.tie(0);int n,m;cin>>n>>m;int s=1,t=n,i;for(i=1;i<=m;i++){int u,v,w;cin>>u>>v>>w;inc(u,v,w);}dinic(s,t);find(s);int ans=1,f=0;for(i=2;i<=len;i+=2){int u=maze[i].u,v=maze[i].v;if(vis[u]+vis[v]==1){f=1;ans=ans*maze[i].fl%mod;}}cout<<(f?ans:0)<<endl;return 0;
}
(最小割求最小割集)poweroj2883病毒侵染相关推荐
- Sabotage UVA - 10480 (最小割+求最小割去掉的具体边+ISAP)
传送门 题意:给定n个点,m条带权无向边,源点s=1,汇点t=2.去掉一些边之后使s,t不连通,求去掉的这些边(而且还要满足去掉的边权和是所有答案中最小的--最小割). n<=50,m<= ...
- 【网络流24题】B、太空飞行计划问题(最大权闭合图转最小割、最小割方案输出)
整理的算法模板合集: ACM模板 B.太空飞行计划问题(最大权闭合图转最小割.最小割方案输出)[省选/NOI- ] P2762 太空飞行计划问题 [问题分析] 最大权闭合图问题,可以转化成最小割问题, ...
- poj1815Friendship(最小割求割边)
链接 题意为去掉多少个顶点使图不连通,求顶点连通度问题.拆点,构造图,对于<u,v>可以变成<u2,v1> <v2,u1>容量为无穷,<u1,u2>容量 ...
- [学习笔记]最小割之最小点权覆盖最大点权独立集
最小点权覆盖 给出一个二分图,每个点有一个非负点权 要求选出一些点构成一个覆盖,问点权最小是多少 建模: S到左部点,容量为点权 右部点到T,容量为点权 左部点到右部点的边,容量inf 求最小割即可. ...
- 最小割分治(最小割树):BZOJ2229 BZOJ4519
定理:n个点的无向图的最小割最多n-1个. 可能从某种形式上形成了一棵树,不是很清楚. 最小割分治:先任选两个点求一边最小割,然后将两边分别递归,就能找到所有的最小割. 这两个题是一样的,直接搬din ...
- [AHOI2009]最小割【最小割+Tarjan】
题目链接 P4126 [AHOI2009]最小割 将题目拆解成两个问题,我们分别进行求解. 可以作为最小割的边 如果它可以是最小割中的边的话,首先它需要满足的是流过它的流是满流的,这是因为如果它被割去 ...
- P4126 [AHOI2009]最小割(网络流/最小割)
P4126 [AHOI2009]最小割 https://www.cnblogs.com/dugudashen/p/6228304.html 求解一张有向图中关于最小割的可行边和必须边,可行边定义为存在 ...
- P3329-[ZJOI2011]最小割【最小割树】
正题 题目链接:https://www.luogu.com.cn/problem/P3329 题目大意 nnn个点mmm条边的无向图,每次询问一个xxx表示最小割不超过xxx的点对数量. 解题思路 我 ...
- bzoj2229: [Zjoi2011]最小割(最小割树)
传送门 这题是用最小割树做的(不明白最小割树是什么的可以去看看这一题->这里) 有了最小割树就很简单了--点数那么少--每次跑出一个最大流就暴力搞一遍就好了 1 //minamoto 2 #in ...
- poj 3308(最小割求解最小点权覆盖)
火星人侵略地球,他们意图登陆破坏某个地区的兵器工厂.据探子回报,火星人登陆的地区为n*m大小的地域,而且每一个火星人的着陆点坐标已知. 火星人很强悍,只要有一个火星人着陆后能够幸存,他必定能毁坏这片区 ...
最新文章
- C 语言和 C++、C# 的区别在什么地方?
- java初始化实例化_Java对象的创建过程:类的初始化与实例化
- Python 工匠:在边界处思考
- 内核添加dts后,device和device_driver的match匹配的变动:通过compatible属性进行匹配【转】...
- Oracle For Linux安装脚本
- 未来中国最受宠的人才
- Airtable(数据管理)
- boost::log模块实现多线程异步日志记录示例
- LNMPA(LNMP0.7)安装出现502 Bad Gateway解决方法
- 轻松搭建Google ADK开发环境
- python程序设计实验报告实验程序流程序列化_Python程序设计_教学大纲_段震.doc
- One River CEO:从长远来看比特币可能达到每枚50万美元
- 使用MyBatis select数据库查出有数据 但返回对象为null时的解决办法
- 2020软考数据库系统工程师-下午案例分析真题解析视频-任铄-专题视频课程
- QQ浏览器微信版抢先玩!变QQ微信电脑版
- opencv视频拼接 opencv视频拼接优化
- 计算机临时保存信息,Windows临时文件夹是什么,Windows临时文件夹保存位置在哪里?...
- kafka auto.offset.reset值失效 earliest/latest详解
- 操作系统:文件共享的实现方法
- 二维数字图像相关算法软件Ncorr的使用心得