题目描述

  给你一个图,每条边有一个权值。要求你选一些边,满足对于每条从\(1\)到\(n\)的路径上(可以不是简单路径)有且仅有一条被选中的边。问你选择的边的边权和最小值。

  \(n\leq 100\)

题解

  先把整张图分为两个集合\(S,T\),其中\(S\)是从原点开始BFS能够到达的点组成的集合,\(T\)是剩下的点组成的集合。

  如果没有在一条路径上只能选一条边的限制,就是一个普通的网络流了。

  我们看看什么情况下这个条件不会被满足。

  

  上面这个图中我们选择了\((1,2)\)和\((4,6)\)。\(S=\{1,3,4\},T=\{2,5,6\}\)。

  可以发现如果多次从\(S\)走到\(T\)(比如上面这张图中\(1\rightarrow2\rightarrow4\rightarrow6\)),那么这些\(S\rightarrow T\)的边就都被选中同时在同一条路径上。所以不合法。

  所以一旦走到\(T\)后就不能走回\(S\)。  

  如果一条边从\(T\)指向\(S\),那么这条边的反向边就满流了。

  为了避免这种情况,只需要把反向边的容量设为\(\infty\)。

  坑点:如果一条边的两个断点与\(S\)或\(T\)不连通,就不要连边。

  时间复杂度:\(O(\)能过\()\)

代码

#include<cstdio>
#include<cstring>
#include<algorithm>
#include<queue>
using namespace std;
typedef long long ll;
const ll inf=1e15;
namespace flow
{
int v[100010];
ll c[100010];
int t[100010];
int h[100010];
int n;
void add(int x,int y,ll a)
{
n++;
v[n]=y;
c[n]=a;
t[n]=h[x];
h[x]=n;
}
int d[100010];
int e[100010];
int op(int x)
{
return ((x-1)^1)+1;
}
int S,T;
queue<int> q;
int num;
int cur[100010];
void bfs()
{
memset(d,-1,sizeof d);
d[T]=0;
q.push(T);
int x,i;
while(!q.empty())
{
x=q.front();
q.pop();
e[d[x]]++;
for(i=h[x];i;i=t[i])
if(c[op(i)]&&d[v[i]]==-1)
{
d[v[i]]=d[x]+1;
q.push(v[i]);
}
}
}
ll dfs(int x,ll flow)
{
if(x==T)
return flow;
ll s=0,u;
for(int &i=cur[x];i;i=t[i])
if(c[i]&&d[v[i]]==d[x]-1)
{
u=dfs(v[i],min(flow,c[i]));
s+=u;
flow-=u;
c[i]-=u;
c[op(i)]+=u;
if(!flow)
return s;
}
e[d[x]]--;
if(!e[d[x]])
d[S]=num;
d[x]++;
e[d[x]]++;
cur[x]=h[x];
return s;
}
ll solve()
{
ll ans=0;
bfs();
memcpy(cur,h,sizeof h);
while(d[S]>=0&&d[S]<=num-1)
ans+=dfs(S,inf);
return ans;
}
}
void add(int x,int y,int c)
{
flow::add(x,y,c);
flow::add(y,x,inf);
}
int f[110][110];
int lx[2510];
int ly[2510];
int lz[2510];
int n,m;
int main()
{
#ifndef ONLINE_JUDGE
freopen("b.in","r",stdin);
freopen("b.out","w",stdout);
#endif
scanf("%d%d",&n,&m);
int i,j,k;
for(i=1;i<=m;i++)
{
scanf("%d%d%d",&lx[i],&ly[i],&lz[i]);
lx[i]++;
ly[i]++;
f[lx[i]][ly[i]]=1;
}
for(k=1;k<=n;k++)
for(i=1;i<=n;i++)
if(i!=k&&f[i][k])
for(j=1;j<=n;j++)
if(j!=i&&j!=k)
f[i][j]|=f[i][k]&&f[k][j];
for(i=1;i<=n;i++)
f[i][i]=1;
flow::S=1;
flow::T=n;
flow::num=n;
for(i=1;i<=m;i++)
if(f[1][lx[i]]&&f[ly[i]][n])
add(lx[i],ly[i],lz[i]);
ll ans=flow::solve();
if(ans>=inf)
printf("-1\n");
else
printf("%lld\n",ans);
return 0;
}

【XSY2708】hack 网络流的更多相关文章

  1. ACM-ICPC 2018 沈阳赛区网络预赛 F. Fantastic Graph (贪心或有源汇上下界网络流)

    "Oh, There is a bipartite graph.""Make it Fantastic."X wants to check whether a ...

  2. 【洛谷】NOIP提高组模拟赛Day1【组合数学】【贪心+背包】【网络流判断是否满流以及流量方案】

    U41568 Agent1 题目背景 2018年11月17日,中国香港将会迎来一场XM大战,是世界各地的ENLIGHTENED与RESISTANCE开战的地点,某地 的ENLIGHTENED总部也想派 ...

  3. css常用hack

    原文地址:css常用hack 突然想起今天早上在CNZZ看到的统计数据,使用IE6.7的用户比例还真多,看到之后我的心都碎了.微软都放弃了为毛还有这么多人不死心? 所以说,IE下的兼容还是得做的. – ...

  4. CSS3_01之选择器、Hack

    1.兄弟选择器:①相邻兄弟选择器:元素的后一个兄弟元素,选择器1+选择器2:②通用兄弟选择器:元素后的所有兄弟元素,选择器1~选择器2: 2.属性选择器:attr表示属性名称,elem表示元素名:①[ ...

  5. plain framework 1 网络流 缓存数据详解

    网络流是什么?为什么网络流中需要存在缓存数据?为什么PF中要采用缓存网络数据的机制?带着这几个疑问,让我们好好详细的了解一下在网络数据交互中我们容易忽视以及薄弱的一块.该部分为PF现有的网络流模型,但 ...

  6. CSS Hack技术介绍及常用的Hack技巧集锦

    一.什么是CSS Hack? 不同的浏览器对CSS的解析结果是不同的,因此会导致相同的CSS输出的页面效果不同,这就需要CSS Hack来解决浏览器局部的兼容性问题.而这个针对不同的浏览器写不同的CS ...

  7. Medial Queries的另一用法——实现IE hack

    众所周知,有些时候为了实现IE下的某些效果与现代浏览器一致,我们不得不使用一些hack手段来实现目的.比如说使用"\0","\"和"\9"来 ...

  8. CSS Hack

    CSS HACK,网上有很多,主要是IE版本不同造成的,尽量不要用CSS HACK,实在调不过去可以用一用,相信以后随着IE低版本的淘汰,CSS HACK也将不在使用. 类内部HACK IE6识别 - ...

  9. 网络流模板 NetworkFlow

    身边的小伙伴们都在愉快地刷网络流,我也来写一发模板好了. Network Flow - Maximum Flow Time Limit : 1 sec, Memory Limit : 65536 KB ...

随机推荐

  1. poj2226 Muddy Fields 填充棒子(二分匹配)

    参考博客:https://blog.csdn.net/liujc_/article/details/51287019 参考博客:https://blog.csdn.net/acdreamers/art ...

  2. c++入门之内置数组和array比较

    array是C++11中新提出来的容器类型,与内置数组相比,array是一种更容易使用,更加安全的数组类型,可以用来替代内置数组.作为数组的升级版,继承了数组最基本的特性,也融入了很多容器操作,下面介 ...

  3. 如果需要精确的答案,请避免使用float和double

    Java中的简单浮点数类型float和double不能够进行运算.不光是Java,在其它很多编程语言中也有这样的问题.在大多数情况下,计算的结果是准确的,但是多试几次(可以做一个循环)就可以试出类似上 ...

  4. Linux 环境变量梳理

    Linux中的环境变量有两种:全局变量和局部变量: 定义.访问.删除局部变量 查看全局变量 可以使用printenv或者env命令来打印所有的全局变量. 访问某一项全局变量,可以使用printenv ...

  5. 10-vue的介绍

    vue的作者叫尤雨溪,中国人.自认为很牛逼的人物,也是我的崇拜之神. 关于他本人的认知,希望大家读一下这篇关于他的文章,或许你会对语言,技术,产生浓厚的兴趣.https://mp.weixin.qq. ...

  6. eclipse 中右键项目出现卡死导致无法共享项目的解决办法

    亲身经历,这个问题出自于项目中的SVN地址不对,如果要更改SVN地址,可以断掉计算机的网,在eclipse的工作空间中找到该项目,找到隐藏的.svn 文件夹,删除掉之后,打开eclipse,此时就可以 ...

  7. C#设计模式之10:状态模式

    状态模式 状态模式将合适的Context(上下文)模拟成一个状态机,在这个状态机的内部,由Context来决定整个状态机的状态,再根据不同的状态执行不同的方法.在C#编译器的帮助下,很多语法糖的背后都 ...

  8. Setting property 'source' to 'org.eclipse.jst.jee.server:hczm' did not find a matching property

  9. linux php7 安装redis扩展

    1,下载redis扩展地址:https://pecl.php.net/package/redis 选择你需要的版本 上传redis-3.1.3.tar.gz到/usr/local/src目录 cd / ...

  10. Golang的聊天服务器实践(群聊,广播)(一)

    其实从上学开始就一直想写一个im. 最近深入go,真是学会了太多,感觉人森虽然苦短,但是也不能只用python.很多知识是不用编译型语言无法了解的. 该来的还是会来,现在会一步一步用go把这个服务器完 ...