传送门

首先跑一遍最短路,如果一条边满足\(dis[v]=dis[u]+w[i]\),那么这条边就在最短路中,把它加进网络流的图里

然后点的流量限制的话拆点,把每个点拆成两个,中间连边来限制流量

最后跑一遍最大流即可,注意两张图不要弄混掉,还有要开\(long\ long\),\(inf\)也要大一点

以上是题解,以下是粗口

出题人我,数据范围大你说一声,我头一次见不开\(int\)和\(inf\)开小直接爆零的你数据好歹出的有点梯度结果我还以为自己哪里打错了找了半天最后只好去看题解才发现要开\(long\ long\)我

//minamoto
#include<bits/stdc++.h>
#define R register
#define ll long long
#define inf 1e18
#define fp(i,a,b) for(R int i=a,I=b+1;i<I;++i)
#define fd(i,a,b) for(R int i=a,I=b-1;i>I;--i)
#define go(u) for(R int i=head[u],v=e[i].v;i;i=e[i].nx,v=e[i].v)
#define gg(u) for(int &i=cur[u],v=e[i].v;i;i=e[i].nx,v=e[i].v)
using namespace std;
char buf[1<<21],*p1=buf,*p2=buf;
inline char getc(){return p1==p2&&(p2=(p1=buf)+fread(buf,1,1<<21,stdin),p1==p2)?EOF:*p1++;}
int read(){
R int res,f=1;R char ch;
while((ch=getc())>'9'||ch<'0')(ch=='-')&&(f=-1);
for(res=ch-'0';(ch=getc())>='0'&&ch<='9';res=res*10+ch-'0');
return res*f;
}
const int N=1005,M=5e5+5;
struct eg{int v,nx;ll w;};int n,m,S,T;
struct net{
eg e[M];int head[N],tot=1;
inline void add(R int u,R int v,R ll w){
e[++tot]={v,head[u],w},head[u]=tot;
e[++tot]={u,head[v],0},head[v]=tot;
}
int q[N],cur[N],dep[N],h,t,u;
bool bfs(){
fp(i,S,T)cur[i]=head[i],dep[i]=-1;
q[h=t=1]=S,dep[S]=0;
while(h<=t){
int u=q[h++];
go(u)if(e[i].w&&dep[v]<0){
dep[v]=dep[u]+1,q[++t]=v;
if(v==T)return true;
}
}return false;
}
ll dfs(int u,ll lim){
if(u==T||!lim)return lim;
ll flow=0,f;
gg(u)if(dep[v]==dep[u]+1&&(f=dfs(v,min(lim,e[i].w)))){
flow+=f,lim-=f;
e[i].w-=f,e[i^1].w+=f;
if(!lim)break;
}return flow;
}
ll dinic(){ll flow=0;while(bfs())flow+=dfs(S,inf);return flow;}
}TT;
struct dis{
eg e[M];int head[N],tot=1;
inline void add(R int u,R int v,R ll w){e[++tot]={v,head[u],w},head[u]=tot; }
int vis[N],h,t,u,v,w,q[N];ll dis[N];
void spfa(){
fp(i,1,n)dis[i]=inf,vis[i]=0;
dis[1]=0,h=0,t=1,q[0]=1;
while(h!=t){
u=q[h++],vis[u]=0;if(h==N)h=0;
go(u)if(dis[v]>dis[u]+e[i].w){
dis[v]=dis[u]+e[i].w;
if(!vis[v]){
vis[v]=1,q[t++]=v;
if(t==N)t=0;
}
}
}
}
void MAIN(){
n=read(),m=read(),S=0,T=(n<<1)+1;
fp(i,1,m)u=read(),v=read(),w=read(),add(u,v,w),add(v,u,w);
spfa();fp(u,1,n)go(u)if(dis[v]==dis[u]+e[i].w)TT.add(u+n,v,inf);
fp(i,1,n)w=read(),TT.add(i,i+n,w);
TT.add(1,1+n,inf),TT.add(n,n+n,inf),TT.add(S,1,inf),TT.add(n+n,T,inf);
printf("%lld\n",TT.dinic());
}
}G;
signed main(){
// freopen("testdata.in","r",stdin);
G.MAIN();return 0;
}

P3171 [CQOI2015]网络吞吐量的更多相关文章

  1. 洛谷 P3171 [CQOI2015]网络吞吐量 解题报告

    P3171 [CQOI2015]网络吞吐量 题目描述 路由是指通过计算机网络把信息从源地址传输到目的地址的活动,也是计算机网络设计中的重点和难点.网络中实现路由转发的硬件设备称为路由器.为了使数据包最 ...

  2. BZOJ 3931 / Luogu P3171 [CQOI2015]网络吞吐量 (最大流板题)

    题面 中文题目,不解释: BZOJ传送门 Luogu传送门 分析 这题建图是显然的,拆点后iii和i′i'i′连容量为吞吐量的边,根据题目要求,111和nnn的吞吐量看作∞\infty∞. 然后用di ...

  3. BZOJ 3931: [CQOI2015]网络吞吐量

    3931: [CQOI2015]网络吞吐量 Time Limit: 10 Sec  Memory Limit: 512 MBSubmit: 1555  Solved: 637[Submit][Stat ...

  4. bzoj3931: [CQOI2015]网络吞吐量

    将最短路图找出来,跑maxflow即可.有注意到数据范围.然后输出的时候%dWA了三次QAQ... #include<cstdio> #include<cstring> #in ...

  5. BZOJ 3931: [CQOI2015]网络吞吐量 最大流

    3931: [CQOI2015]网络吞吐量 Time Limit: 1 Sec Memory Limit: 256 MB 题目连接 http://www.lydsy.com/JudgeOnline/p ...

  6. BZOJ 3931: [CQOI2015]网络吞吐量( 最短路 + 最大流 )

    最短路 + 最大流 , 没什么好说的... 因为long long WA 了两次.... ------------------------------------------------------- ...

  7. 3931: [CQOI2015]网络吞吐量

    3931: [CQOI2015]网络吞吐量 链接 分析: 跑一遍dijkstra,加入可以存在于最短路中的点,拆点最大流. 代码: #include<cstdio> #include< ...

  8. bzoj千题计划136:bzoj3931: [CQOI2015]网络吞吐量

    http://www.lydsy.com/JudgeOnline/problem.php?id=3931 在最短路网络上跑最大流 #include<queue> #include<c ...

  9. bzoj 3931: [CQOI2015]网络吞吐量 -- 最短路+网络流

    3931: [CQOI2015]网络吞吐量 Time Limit: 10 Sec  Memory Limit: 512 MB Description 路由是指通过计算机网络把信息从源地址传输到目的地址 ...

随机推荐

  1. 动态规划:HDU 1114 Piggy-Bank

    Problem Description Before ACM can do anything, a budget must be prepared and the necessary financia ...

  2. HDU 1244 【DP】

    题意: 中文. 思路: 先初步处理,用give-take求出每个城市剩的钱. 求解问题转化成使得和不小于0的最长连续字串. 枚举起点,然后当该起点加的和为负时开始枚举下一起点.(这个状态的转移) 2W ...

  3. POJ 3159 【朴素的差分约束】

    好吧终于知道什么是“高大上”的差分约束了.嗷嗷 题意: 小朋友们分糖果,某个小朋友不想另外一个小朋友分到的糖果数比自己多N块以上. 求编号为N的小朋友最多比编号为1的小朋友多分多少块糖果. 思路: 差 ...

  4. 2017多校Round3(hdu6056~hdu6066)

    补题进度:7/11 1001 待填坑 1002 待填坑 1003(set) 题意: 给定长度为n(n<=5e5)的数组(是n的一个排列)和一个整数k(k<=80),f[l,r]定义为区间[ ...

  5. linux otl oracle数据库连接例子

    #include <string> #include <iostream> using namespace std; #define OTL_ORA10G   //我连的是LI ...

  6. Effective Java Profiling With Open Source Tools

    https://www.infoq.com/articles/java-profiling-with-open-source

  7. CentOS5 忘记root密码的解决办法

    方法/步骤   1 开机启动的时候,按“E”进入如下界面. 2 选择相应的内核,再次按“E”,出现下图,选择第二项,再次按“E”键 3 在尾部加:“空格+single”(如图),Enter.图如下: ...

  8. Office WORD WPS如何取消拼写检查

    1 审阅-修订-修订选项-拼写,全部取消勾选.

  9. VC++如何折叠代码

    工具-选项,然后在文本编辑器,C/C++中的格式设置,把大纲语句块设置为True   这样之后,还是不能像C#一样使用region折叠代码,但是可以方法和if语句都会自动显示可以折叠.   使用#pr ...

  10. 使用vscode 编译 sass

    由于我在工作中用的编辑器是 vscode ,所以记录一下vscode 编译sass 的配置 vs code 编译saass 1.在扩展里搜索“easy sass”,直接进行安装即可 2.安装后默认已经 ...