poweroj2883病毒侵染

思路:

寻找割掉kkk条边,使∏i=1kwi\prod\limits_{i=1}^{k}w_ii=1∏k​wi​最小,我们可以取对数,即求∑i=1klog⁡wi\sum\limits_{i=1}^{k}\log{w_i}i=1∑k​logwi​最小,这样就转换成了最小割。但是我们计算答案要寻找割掉的边然后将权值累乘。
可以想到,最小割是指求出权值和最小的边集,使得源点和汇点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病毒侵染相关推荐

  1. Sabotage UVA - 10480 (最小割+求最小割去掉的具体边+ISAP)

    传送门 题意:给定n个点,m条带权无向边,源点s=1,汇点t=2.去掉一些边之后使s,t不连通,求去掉的这些边(而且还要满足去掉的边权和是所有答案中最小的--最小割). n<=50,m<= ...

  2. 【网络流24题】B、太空飞行计划问题(最大权闭合图转最小割、最小割方案输出)

    整理的算法模板合集: ACM模板 B.太空飞行计划问题(最大权闭合图转最小割.最小割方案输出)[省选/NOI- ] P2762 太空飞行计划问题 [问题分析] 最大权闭合图问题,可以转化成最小割问题, ...

  3. poj1815Friendship(最小割求割边)

    链接 题意为去掉多少个顶点使图不连通,求顶点连通度问题.拆点,构造图,对于<u,v>可以变成<u2,v1> <v2,u1>容量为无穷,<u1,u2>容量 ...

  4. [学习笔记]最小割之最小点权覆盖最大点权独立集

    最小点权覆盖 给出一个二分图,每个点有一个非负点权 要求选出一些点构成一个覆盖,问点权最小是多少 建模: S到左部点,容量为点权 右部点到T,容量为点权 左部点到右部点的边,容量inf 求最小割即可. ...

  5. 最小割分治(最小割树):BZOJ2229 BZOJ4519

    定理:n个点的无向图的最小割最多n-1个. 可能从某种形式上形成了一棵树,不是很清楚. 最小割分治:先任选两个点求一边最小割,然后将两边分别递归,就能找到所有的最小割. 这两个题是一样的,直接搬din ...

  6. [AHOI2009]最小割【最小割+Tarjan】

    题目链接 P4126 [AHOI2009]最小割 将题目拆解成两个问题,我们分别进行求解. 可以作为最小割的边 如果它可以是最小割中的边的话,首先它需要满足的是流过它的流是满流的,这是因为如果它被割去 ...

  7. P4126 [AHOI2009]最小割(网络流/最小割)

    P4126 [AHOI2009]最小割 https://www.cnblogs.com/dugudashen/p/6228304.html 求解一张有向图中关于最小割的可行边和必须边,可行边定义为存在 ...

  8. P3329-[ZJOI2011]最小割【最小割树】

    正题 题目链接:https://www.luogu.com.cn/problem/P3329 题目大意 nnn个点mmm条边的无向图,每次询问一个xxx表示最小割不超过xxx的点对数量. 解题思路 我 ...

  9. bzoj2229: [Zjoi2011]最小割(最小割树)

    传送门 这题是用最小割树做的(不明白最小割树是什么的可以去看看这一题->这里) 有了最小割树就很简单了--点数那么少--每次跑出一个最大流就暴力搞一遍就好了 1 //minamoto 2 #in ...

  10. poj 3308(最小割求解最小点权覆盖)

    火星人侵略地球,他们意图登陆破坏某个地区的兵器工厂.据探子回报,火星人登陆的地区为n*m大小的地域,而且每一个火星人的着陆点坐标已知. 火星人很强悍,只要有一个火星人着陆后能够幸存,他必定能毁坏这片区 ...

最新文章

  1. C 语言和 C++、C# 的区别在什么地方?
  2. java初始化实例化_Java对象的创建过程:类的初始化与实例化
  3. Python 工匠:在边界处思考
  4. 内核添加dts后,device和device_driver的match匹配的变动:通过compatible属性进行匹配【转】...
  5. Oracle For Linux安装脚本
  6. 未来中国最受宠的人才
  7. Airtable(数据管理)
  8. boost::log模块实现多线程异步日志记录示例
  9. LNMPA(LNMP0.7)安装出现502 Bad Gateway解决方法
  10. 轻松搭建Google ADK开发环境
  11. python程序设计实验报告实验程序流程序列化_Python程序设计_教学大纲_段震.doc
  12. One River CEO:从长远来看比特币可能达到每枚50万美元
  13. 使用MyBatis select数据库查出有数据 但返回对象为null时的解决办法
  14. 2020软考数据库系统工程师-下午案例分析真题解析视频-任铄-专题视频课程
  15. QQ浏览器微信版抢先玩!变QQ微信电脑版
  16. opencv视频拼接 opencv视频拼接优化
  17. 计算机临时保存信息,Windows临时文件夹是什么,Windows临时文件夹保存位置在哪里?...
  18. kafka auto.offset.reset值失效 earliest/latest详解
  19. 操作系统:文件共享的实现方法
  20. 二维数字图像相关算法软件Ncorr的使用心得

热门文章

  1. matlab 门限回归模型,门限回归及Stata操作汇总与空间门槛回归模型简介
  2. 人工智能的安全、伦理和隐私问题
  3. Java方法的重载和重写
  4. CC2430基础——外部中断分析
  5. 贾琏欲执事(JDBC连接数据库)
  6. spriteKit 笔记三 —— Drog 精灵
  7. Flutter+原生开发与H5+原生开发的区别在哪里?
  8. Ubuntu16.04 忘记登陆密码 重新设置密码
  9. word论文封面下划线对齐
  10. Fiddler证书 在 ios 上信任后仍提示不受信任的解决方法