【HDOJ6582】Path(最短路图,最小割)
题意:
n,m<=1e4,c<=1e9
思路:
- #include<bits/stdc++.h>
- using namespace std;
- typedef long long ll;
- typedef unsigned int uint;
- typedef unsigned long long ull;
- typedef pair<int,int> PII;
- typedef pair<ll,ll> Pll;
- typedef vector<int> VI;
- #define N 110000
- #define M 1100000
- #define fi first
- #define se second
- #define MP make_pair
- #define pi acos(-1)
- #define mem(a,b) memset(a,b,sizeof(a))
- #define rep(i,a,b) for(int i=(int)a;i<=(int)b;i++)
- #define per(i,a,b) for(int i=(int)a;i>=(int)b;i--)
- #define lowbit(x) x&(-x)
- #define Rand (rand()*(1<<16)+rand())
- #define id(x) ((x)<=B?(x):m-n/(x)+1)
- #define ls p<<1
- #define rs p<<1|1
- const int MOD=1e9+;
- double eps=1e-;
- ll INF=1e14;
- priority_queue<pair<ll,int> > q;
- ll dis[N],dis1[N],dis2[N];
- int head[N],vet[N],nxt[N],len[N],vis[N],fan[N],gap[N],n,m,tot,S,T,s;
- struct arr
- {
- int x,y,z;
- }a[N];
- int read()
- {
- int v=,f=;
- char c=getchar();
- while(c<||<c) {if(c=='-') f=-; c=getchar();}
- while(<=c&&c<=) v=(v<<)+v+v+c-,c=getchar();
- return v*f;
- }
- void add(int a,int b,int c)
- {
- nxt[++tot]=head[a];
- vet[tot]=b;
- len[tot]=c;
- head[a]=tot;
- }
- void Add(int a,int b,int c)
- {
- nxt[++tot]=head[a];
- vet[tot]=b;
- len[tot]=c;
- head[a]=tot;
- nxt[++tot]=head[b];
- vet[tot]=a;
- len[tot]=;
- head[b]=tot;
- }
- void dijk(int st,int op)
- {
- mem(vis,);
- rep(i,,n) dis[i]=1e13;
- while(!q.empty()) q.pop();
- q.push(MP(,st)); dis[st]=;
- while(!q.empty())
- {
- int u=q.top().se;
- q.pop();
- if(vis[u]) continue;
- vis[u]=;
- int e=head[u];
- while(e)
- {
- int v=vet[e];
- if(dis[u]+len[e]<dis[v])
- {
- dis[v]=dis[u]+len[e];
- q.push(MP(-dis[v],v));
- }
- e=nxt[e];
- }
- }
- if(op==)
- {
- rep(i,,n) dis1[i]=dis[i];
- }
- else
- {
- rep(i,,n) dis2[i]=dis[i];
- }
- }
- ll dfs(int u,int aug)
- {
- if(u==T) return aug;
- int e=head[u],flow=;
- ll val=s-;
- while(e)
- {
- int v=vet[e];
- if(len[e])
- {
- if(dis[u]==dis[v]+)
- {
- int t=dfs(v,min(len[e],aug-flow));
- len[e]-=t;
- len[fan[e]]+=t;
- flow+=t;
- if(dis[S]>=s) return flow;
- if(aug==flow) break;
- }
- val=min(val,dis[v]);
- }
- e=nxt[e];
- }
- if(!flow)
- {
- gap[dis[u]]--;
- if(!gap[dis[u]]) dis[S]=s;
- dis[u]=val+;
- gap[dis[u]]++;
- }
- return flow;
- }
- ll maxflow()
- {
- mem(gap,);
- mem(dis,);
- gap[]=s;
- ll ans=;
- while(dis[S]<s) ans+=dfs(S,INF);
- return ans;
- }
- int main()
- {
- //freopen("1.in","r",stdin);
- //freopen("1.out","w",stdout);
- rep(i,,)
- if(i&) fan[i]=i+;
- else fan[i]=i-;
- int cas=read();
- while(cas--)
- {
- n=read(),m=read();
- rep(i,,m)
- {
- a[i].x=read();
- a[i].y=read();
- a[i].z=read();
- }
- tot=;
- rep(i,,n) head[i]=;
- rep(i,,m) add(a[i].x,a[i].y,a[i].z);
- dijk(,);
- tot=;
- rep(i,,n) head[i]=;
- rep(i,,m) add(a[i].y,a[i].x,a[i].z);
- dijk(n,);
- tot=;
- rep(i,,n) head[i]=;
- rep(i,,m)
- if(dis1[a[i].x]+a[i].z+dis2[a[i].y]==dis1[n])
- Add(a[i].x,a[i].y,a[i].z);
- S=; T=n; s=n;
- ll ans=maxflow();
- printf("%I64d\n",ans);
- }
- return ;
- }
【HDOJ6582】Path(最短路图,最小割)的更多相关文章
- bzoj1266 [AHOI2006]上学路线route floyd建出最短路图+最小割
1266: [AHOI2006]上学路线route Time Limit: 3 Sec Memory Limit: 162 MBSubmit: 2490 Solved: 898[Submit][S ...
- hdu3870 基于最短路的最小割
题意: 给你一个平面图,让你输出(1,1),(n ,n)的最小割.. 思路: 看完题想都没想直接最大流,结果TLE,想想也是 G<400*400,400*400*4> ...
- hdu 5294 Tricks Device 最短路建图+最小割
链接:http://acm.hdu.edu.cn/showproblem.php?pid=5294 Tricks Device Time Limit: 2000/1000 MS (Java/Other ...
- bzoj 1001 平面图转对偶图 最短路求图最小割
原题传送门http://www.lydsy.com/JudgeOnline/problem.php?id=1001 整理了下之前A的题 平面图可以转化成对偶图,然后(NlogN)的可以求出图的最小割( ...
- UVALive 3661 Animal Run(最短路解最小割)
题意:动物要逃跑,工作人员要截断从START(左上角)到END(右下角)的道路,每条边权表示拦截该条道路需要多少工作人员.问最少需要多少人才能完成拦截. 通俗地讲,就是把图一分为二所造成消耗的最小值. ...
- hdu-5889-最短路+网络流/最小割
Barricade Time Limit: 3000/1000 MS (Java/Others) Memory Limit: 65536/65536 K (Java/Others)Total S ...
- SPOJ-OPTM Optimal Marks ★★(按位建图 && 最小割)
[题意]给出一个无向图,每个点有一个标号mark[i],不同点可能有相同的标号.对于一条边(u, v),它的权值定义为mark[u] xor mark[v].现在一些点的标号已定,请决定剩下点的标号, ...
- POJ 2987 Firing【最大权闭合图-最小割】
题意:给出一个有向图,选择一个点,则要选择它的可以到达的所有节点.选择每个点有各自的利益或损失.求最大化的利益,以及此时选择人数的最小值. 算法:构造源点s汇点t,从s到每个正数点建边,容量为利益.每 ...
- BZOJ 1001: [BeiJing2006]狼抓兔子(s-t平面图+最短路求最小割)
http://www.lydsy.com/JudgeOnline/problem.php?id=1001 题意: 思路:这道题目是最小割题目,但是吧你直接套用Dinic是会超时的. 这里有种很奇妙的做 ...
- [luoguP2762] 太空飞行计划问题(最大权闭合图—最小割—最大流)
传送门 如果将每一个实验和其所对的仪器连一条有向边,那么原图就是一个dag图(有向无环) 每一个点都有一个点权,实验为收益(正数),仪器为花费(负数). 那么接下来可以引出闭合图的概念了. 闭合图是原 ...
随机推荐
- 2019/12/22 TZOJ
4986 Team Formation http://www.tzcoder.cn/acmhome/problemdetail.do?&method=showdetail&id=498 ...
- 微信小程序这一块(下)
1.小程序分为两部分 :页面.组件 2.小程序中如何定义自定义组件? 凡是通过Page创建的都是页面,而通过Components创建的都是组件 当组件创建成功后,在需要使用的页面进行引入,(找到页面的 ...
- HTML5-注册表单案例fieldset
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...
- PHP中的九大缓存技术
1.全页面静态化缓存也就是将页面全部生成html静态页面,用户访问时直接访问的静态页面,而不会去走php服务器解析的流程.此种方式,在CMS系统中比较常见,比如dedecms: 一种比较常用的实现方式 ...
- LinkedList -链表集合
package cn.learn.collection; import java.util.LinkedList; import java.util.Queue; /* java.util.xxx A ...
- Java中的容器(集合)之HashMap源码解析
1.HashMap源码解析(JDK8) 基础原理: 对比上一篇<Java中的容器(集合)之ArrayList源码解析>而言,本篇只解析HashMap常用的核心方法的源码. HashMap是 ...
- Linux删除自带的openjdk,安装jdk1.8
第一步:查看有哪些安装包 [root@localhost ~]# rpm -qa | grep javatzdata-java-2016g-2.el7.noarchpython-javapackage ...
- KNN算法案例--手写数字识别
import numpy as np import matplotlib .pyplot as plt import pandas as pd from sklearn.neighbors impor ...
- hdu3664 Permutation Counting(dp)
hdu3664 Permutation Counting 题目传送门 题意: 在一个序列中,如果有k个数满足a[i]>i:那么这个序列的E值为k,问你 在n的全排列中,有多少个排列是恰好是E值为 ...
- 如何优化MySQL千万级大表
很好的一篇博客,转载 如何优化MySQL千万级大表 原文链接::https://blog.csdn.net/yangjianrong1985/article/details/102675334 千万级 ...