P3376 【模板】网络最大流(70)
题目描述
如题,给出一个网络图,以及其源点和汇点,求出其网络最大流。
输入输出格式
输入格式:
第一行包含四个正整数N、M、S、T,分别表示点的个数、有向边的个数、源点序号、汇点序号。
接下来M行每行包含三个正整数ui、vi、wi,表示第i条有向边从ui出发,到达vi,边权为wi(即该边最大流量为wi)
输出格式:
一行,包含一个正整数,即为该网络的最大流。
输入输出样例
4 5 4 3
4 2 30
4 3 20
2 3 20
2 1 30
1 3 40
50
说明
时空限制:1000ms,128M
数据规模:
对于30%的数据:N<=10,M<=25
对于70%的数据:N<=200,M<=1000
对于100%的数据:N<=10000,M<=100000
样例说明:
题目中存在3条路径:
4-->2-->3,该路线可通过20的流量
4-->3,可通过20的流量
4-->2-->1-->3,可通过10的流量(边4-->2之前已经耗费了20的流量)
故流量总计20+20+10=50。输出50。
莫名其妙WA三个点,
改天再调
#include<iostream>
#include<cstdio>
#include<cstring>
#include<cmath>
#include<queue>
#include<algorithm>
#define lli long long int
using namespace std;
const int MAXN=;
const int maxn=0x7ffffff;
void read(int &n)
{
char c='+';int x=;bool flag=;
while(c<''||c>'')
{c=getchar();if(c=='-')flag=;}
while(c>=''&&c<='')
{x=x*+c-;c=getchar();}
flag==?n=-x:n=x;
}
struct node
{
int u,v,flow,cap,nxt;
}edge[MAXN];
int head[MAXN];
int num=;
int n,m,S,T;
int dis[MAXN];
int vis[MAXN];
int cur[MAXN];
void add_edge(int x,int y,int z)
{
edge[num].u=x;
edge[num].v=y;
edge[num].cap=z;
edge[num].flow=;
edge[num].nxt=head[x];
head[x]=num++;
}
bool bfs(int bg,int ed)
{
memset(vis,,sizeof(vis));
memset(dis,,sizeof(dis));
queue<int>q;
q.push(bg);
dis[bg]=;
vis[bg]=;
while(!q.empty())
{
int p=q.front();
q.pop();
for(int i=head[p];i!=-;i=edge[i].nxt)
{
if(!vis[edge[i].v]&&edge[i].cap-edge[i].flow>)
{
vis[edge[i].v]=;
dis[edge[i].v]=dis[edge[i].u]+;
q.push(edge[i].v);
}
}
}
return vis[ed];
}
int dfs(int now,int a)// a:所有弧的最小残量
{
if(now==T||a<=)
return a;
int flow=,f;
for(int i=head[now];i!=-;i=edge[i].nxt)
{
if(dis[now]+==dis[edge[i].v]&&edge[i].cap-edge[i].flow>)
{
f=dfs(edge[i].v,min(a,edge[i].cap-edge[i].flow));
edge[i].flow+=f;
edge[i^].flow-=f;
flow+=f;
a-=f;
if(a<=)break;
}
}
return flow;
}
void Dinic(int S,int T)
{
int ansflow=;
//for(int i=1;i<=n;i++)
// cur[i]=head[i];
while(bfs(S,T))
{
ansflow+=dfs(S,maxn);
}// 求出层级
printf("%d",ansflow); }
int main()
{
read(n);read(m);
// swap(n,m);
// S=1;T=m;
read(S);read(T);
for(int i=;i<=n;i++)
head[i]=-;
for(int i=;i<=m;i++)
{
int x,y,z;
read(x);read(y);read(z);
add_edge(x,y,z);
add_edge(y,x,);
}
Dinic(S,T);
return ;
}
P3376 【模板】网络最大流(70)的更多相关文章
- P3376 [模板] 网络最大流
https://www.luogu.org/blog/ONE-PIECE/wang-lao-liu-jiang-xie-zhi-dinic EK 292ms #include <bits/std ...
- 【洛谷 p3376】模板-网络最大流(图论)
题目:给出一个网络图,以及其源点和汇点,求出其网络最大流. 解法:网络流Dinic算法. 1 #include<cstdio> 2 #include<cstdlib> 3 #i ...
- 【Luogu P3376】网络最大流
Luogu P3376 最大流是网络流模型的一个基础问题. 网络流模型就是一种特殊的有向图. 概念: 源点:提供流的节点(入度为0),类比成为一个无限放水的水厂 汇点:接受流的节点(出度为0),类比成 ...
- [模板]网络最大流 & 最小费用最大流
我的作业部落有学习资料 可学的知识点 Dinic 模板 #define rg register #define _ 10001 #define INF 2147483647 #define min(x ...
- P3376 【模板】网络最大流
P3376 [模板]网络最大流 题目描述 如题,给出一个网络图,以及其源点和汇点,求出其网络最大流. 输入输出格式 输入格式: 第一行包含四个正整数N.M.S.T,分别表示点的个数.有向边的个数.源点 ...
- P3376 【模板】网络最大流dinic算法
P3376 [模板]网络最大流 题目描述 如题,给出一个网络图,以及其源点和汇点,求出其网络最大流. 输入输出格式 输入格式: 第一行包含四个正整数N.M.S.T,分别表示点的个数.有向边的个数.源点 ...
- P3376 【模板】网络最大流( Edmonds-krap、Dinic、ISAP 算法)
P3376 [模板]网络最大流( Edmonds-krap.Dinic.ISAP 算法) 题目描述 如题,给出一个网络图,以及其源点和汇点,求出其网络最大流. 输入格式 第一行包含四个正整数N.M.S ...
- 洛谷 P3376 【【模板】网络最大流】
题目描述 如题,给出一个网络图,以及其源点和汇点,求出其网络最大流. 输入 第一行包含四个正整数N.M.S.T,分别表示点的个数.有向边的个数.源点序号.汇点序号. 接下来M行每行包含三个正整数ui. ...
- 洛谷 P3376 【模板】网络最大流
题目描述 如题,给出一个网络图,以及其源点和汇点,求出其网络最大流. 输入输出格式 输入格式: 第一行包含四个正整数N.M.S.T,分别表示点的个数.有向边的个数.源点序号.汇点序号. 接下来M行每行 ...
随机推荐
- go开发和运行环境的配置
1.运行环境的下载.安装.配置: 下载:http://www.golangtc.com/download 官网下载经常被墙屏蔽,所以就从golang中国下载; 安装及其配置:http://jingy ...
- 8 Python+Selenium操作测试对象
[环境信息] Python3.6+selenium3.0.2+Firefox50.0+win7 [操作方法] 1.清除输入框内容:clear() 2.单击一个按钮:click() 3.返回元素尺寸:s ...
- vue.js怎样将时间戳转化为日期格式
<!-- value 格式为13位unix时间戳 --><!-- 10位unix时间戳可通过value*1000转换为13位格式 --> export function for ...
- spring boot --部署war到tomcat中
1.在pom文件中,将默认的jar包打包,改成以war包打包:<!--打包方式--><packaging>war</packaging> 2.将项目在doc命令中执 ...
- javascript事件列表解说
javascript事件列表解说 事件 浏览器支持 解说 一般事件 onclick IE3.N2 鼠标点击时触发此事件 ondblclick IE4.N4 鼠标双击时触发此事件 onmousedown ...
- 【vue】v-if和v-show的区别
今天来捋一下vue中的v-if与v-show的区别 先来看一下vue官方文档对他们的解释 2.从实现方式来看: v-if是当依赖的值变为false时,直接让元素消失,html代码也会消失,相当于直接在 ...
- js 操作table: insertRow(),deleteRow(),insertCell(),deleteCell()方法
表格有几行: var trCnt = table.rows.length; (table为Id ) 每行有几列:for (var i=0; i<trCnt; i++) ...
- HDU2035 - 人见人爱A^B
求A^B的最后三位数表示的整数. 说明:A^B的含义是"A的B次方" Input 输入数据包含多个测试实例,每个实例占一行,由两个正整数A和B组成(1<=A,B<=1 ...
- 【hiho一下 第十一周】树中的最长路
[题目链接]:http://hihocoder.com/problemset/problem/1050 [题意] [题解] 有一个经典的求树的直径的方法; 首先; 树的直径的两端的端点必然都在树的叶子 ...
- JavaScript实验一(添加节点,删除节点)
静态html页面: <!DOCTYPE html> <html> <head lang="en"> <meta charset=" ...