HDU - 3416-Marriage Match IV (最大流 + 最短路)
HDU - 3416:http://acm.hdu.edu.cn/showproblem.php?pid=3416
参考:https://www.cnblogs.com/kuangbin/archive/2013/05/04/3059372.html
题意:
问一个带权值的图中,最多能跑几次最短路,每条路只能走一遍。
思路:
这道题要利用最大流算法和最短路算法。先要跑两遍dji(),第一遍跑从起点S开始跑一遍正图,第二遍从终点T跑一遍反图。这样后枚举每一条边,看这条边的起点到S的距离+这条边的终点到T的距离+这条边长 == 最短路,如果成立,就把这条边 的容量设为1,加入网络流的图中。最后跑一下最大流就行了。
自己在枚举点的时候没有搞清楚终点是T,wa了好几发。
#include <algorithm>
#include <iterator>
#include <iostream>
#include <cstring>
#include <cstdlib>
#include <iomanip>
#include <bitset>
#include <cctype>
#include <cstdio>
#include <string>
#include <vector>
#include <stack>
#include <cmath>
#include <queue>
#include <list>
#include <map>
#include <set>
#include <cassert>
using namespace std;
//#pragma GCC optimize(3)
//#pragma comment(linker, "/STACK:102400000,102400000") //c++
#define lson (l , mid , rt << 1)
#define rson (mid + 1 , r , rt << 1 | 1)
#define debug(x) cerr << #x << " = " << x << "\n";
#define pb push_back
#define pq priority_queue typedef long long ll;
typedef unsigned long long ull; typedef pair<ll ,ll > pll;
typedef pair<int ,int > pii;
typedef pair<int,pii> p3; //priority_queue<int> q;//这是一个大根堆q
//priority_queue<int,vector<int>,greater<int> >q;//这是一个小根堆q
#define fi first
#define se second
//#define endl '\n' #define OKC ios::sync_with_stdio(false);cin.tie(0)
#define FT(A,B,C) for(int A=B;A <= C;++A) //用来压行
#define REP(i , j , k) for(int i = j ; i < k ; ++i)
//priority_queue<int ,vector<int>, greater<int> >que; const ll mos = 0x7FFFFFFF; //
const ll nmos = 0x80000000; //-2147483648
const int inf = 0x3f3f3f3f;
const ll inff = 0x3f3f3f3f3f3f3f3f; //
const int mod = 1e9+;
const double esp = 1e-;
const double PI=acos(-1.0); template<typename T>
inline T read(T&x){
x=;int f=;char ch=getchar();
while (ch<''||ch>'') f|=(ch=='-'),ch=getchar();
while (ch>=''&&ch<='') x=x*+ch-'',ch=getchar();
return x=f?-x:x;
} /*-----------------------showtime----------------------*/
const int maxn = 2e5+;
int n,m,c,ans; int dis[][maxn];
vector<pii>g[][maxn];
//dji
void dji(int f,int soc){
for(int i=; i<=n; i++)dis[f][i] = inf; priority_queue<pii>que;
dis[f][soc] = ;
que.push(pii(,soc)); while(!que.empty()){
pii tmp = que.top();que.pop();
int u = tmp.se;
if(dis[f][u] < -*tmp.fi)continue;
for(int i=; i<g[f][u].size(); i++){
int v = g[f][u][i].fi;
if(dis[f][v] > dis[f][u] + g[f][u][i].se)
{
dis[f][v] = dis[f][u] + g[f][u][i].se;
que.push(pii(-*dis[f][v], v));
}
}
}
}
const int maxm = 1e6+;
struct Edge
{
int u,v,cap;
Edge(){}
Edge(int u,int v,int cap):u(u),v(v),cap(cap){}
}es[maxm];
int R,S,T;
vector<int>tab[maxn];
int diss[maxn],current[maxn];
void addedge(int u,int v,int cap){
tab[u].pb(R);
es[R++] = Edge(u,v,cap);
tab[v].pb(R);
es[R++] = Edge(v,u,);
}
bool BFS(){
queue<int>q;q.push(S);
memset(diss,inf,sizeof(diss));
diss[S] = ;
while(!q.empty()){
int h = q.front();q.pop();
for(int i=; i<tab[h].size(); i++){
Edge & e = es[tab[h][i]];
if(e.cap> &&diss[e.v] == inf){
diss[e.v] = diss[h] + ;
q.push(e.v);
}
}
}
return diss[T] < inf;
} int DFS(int x,int maxflow){
if(x == T){
return maxflow;
}
for(int i=current[x]; i<tab[x].size(); i++){
current[x] = i;
Edge &e = es[tab[x][i]];
if(diss[e.v] == diss[x] + && e.cap > ){
int flow = DFS(e.v, min(maxflow, e.cap));
if(flow>){
e.cap -= flow;
es[tab[x][i] ^ ].cap += flow;
return flow;
}
}
}
return ;
}
int dinic(){
int ans = ;
while(BFS()){
int flow;
memset(current,,sizeof(current));
while(true){
flow = DFS(S,inf);
if(flow > ) ans += flow;
else break;
}
}
return ans;
} int main(){
int t;scanf("%d" , &t); while(t--){ scanf("%d%d", &n, &m);
for(int i=; i<=n; i++)g[][i].clear(),g[][i].clear(),tab[i].clear();
for(int i=; i<=m; i++){
int u,v,c;
scanf("%d%d%d", &u, &v, &c);
if(v == u)continue;
g[][u].pb(pii(v,c));
g[][v].pb(pii(u,c));
}
scanf("%d%d", &S, &T); dji(,S),dji(,T);
// debug(dis[0][n]);
R = ;
for(int i=; i<=n; i++){
for(int j=; j<g[][i].size(); j++){
int u = i,v = g[][i][j].fi;
if(u!=v && dis[][T] == dis[][u] + dis[][v] + g[][i][j].se){
addedge(u,v,);
}
}
}
printf("%d\n", dinic());
}
return ;
}
HDU - 3416
HDU - 3416-Marriage Match IV (最大流 + 最短路)的更多相关文章
- HDU 3416 Marriage Match IV (求最短路的条数,最大流)
Marriage Match IV 题目链接: http://acm.hust.edu.cn/vjudge/contest/122685#problem/Q Description Do not si ...
- HDU 3416 Marriage Match IV(ISAP+最短路)题解
题意:从A走到B,有最短路,问这样不重复的最短路有几条 思路:先来讲选有效边,我们从start和end各跑一次最短路,得到dis1和dis2数组,如果dis1[u] + dis2[v] + cost[ ...
- HDU 3416 Marriage Match IV (最短路径,网络流,最大流)
HDU 3416 Marriage Match IV (最短路径,网络流,最大流) Description Do not sincere non-interference. Like that sho ...
- hdu 3416 Marriage Match IV (最短路+最大流)
hdu 3416 Marriage Match IV Description Do not sincere non-interference. Like that show, now starvae ...
- HDU 3416 Marriage Match IV 【最短路】(记录路径)+【最大流】
<题目链接> 题目大意: 给你一张图,问你其中没有边重合的最短路径有多少条. 解题分析: 建图的时候记得存一下链式后向边,方便寻找最短路径,然后用Dijkstra或者SPFA跑一遍最短路, ...
- HDU 3416 Marriage Match IV (Dijkstra+最大流)
题意:N个点M条边的有向图,给定起点S和终点T,求每条边都不重复的S-->T的最短路有多少条. 分析:首先第一步需要找出所有可能最短路上的边.怎么高效地求出呢?可以这样:先对起点S,跑出最短路: ...
- hdu 3416 Marriage Match IV 【 最短路 最大流 】
求边不可重复的最短路条数 先从起点到终点用一次dijkstra,再从终点到起点用一次dijkstra,来判断一条边是否在最短路上 如果在,就将这条边的两个端点连起来,容量为1 再跑一下dinic(), ...
- HDU 3416 Marriage Match IV (最短路建图+最大流)
(点击此处查看原题) 题目分析 题意:给出一个有n个结点,m条单向边的有向图,问从源点s到汇点t的不重合的最短路有多少条,所谓不重复,意思是任意两条最短路径都不共用一条边,而且任意两点之间的边只会用一 ...
- HDU 3416 Marriage Match IV (最短路径&&最大流)
/*题意: 有 n 个城市,知道了起点和终点,有 m 条有向边,问从起点到终点的最短路一共有多少条.这是一个有向图,建边的时候要注意!!解题思路:这题的关键就是找到哪些边可以构成最短路,其实之前做最短 ...
- HDU 3416 Marriage Match IV dij+dinic
题意:给你n个点,m条边的图(有向图,记住一定是有向图),给定起点和终点,问你从起点到终点有几条不同的最短路 分析:不同的最短路,即一条边也不能相同,然后刚开始我的想法是找到一条删一条,然后光荣TLE ...
随机推荐
- Shell基本语法---常见的条件判断
语法 [ 判断表达式 ] 文件夹或路径是否存在 -e 目标是否存在(exist) -d 是否为路径(directory) -f 是否为文件(file) [ -e text.sh ] || touch ...
- Nginx搭建详细
Linux 安装Nginx搭建详细内容 进入:/usr/java/nginx位置下载nginx: wget et http://nginx.org/download/nginx-1.8.0.tar.g ...
- ERROR 临时
ERROR ITMS-4238: "Redundant Binary Upload. There already exists a binary upload with build vers ...
- sed流编辑器
一.前言 (一).sed 工作流程 sed 是一种在线的.非交互式的流编辑器,它一次处理一行内容.处理时,把当做前处理的行存储在临时缓存区中,成为“模式空间”(pattern space),接着用se ...
- CEPH RGW多 ZONE的配置
相关的名称解释 Region :可以理解为区域,是基于地理位置的逻辑划分:如:华南,华北之类,包含多个region的Ceph集群必须指定一个master region,一个region可以包含一个或者 ...
- scrapyd schedule.json setting 传入多个值
使用案例: import requests adder='http://127.0.0.1:6800' data = { 'project':'v1', 'version':'12379', 'set ...
- luogu1220_关路灯 区间dp
传送门 区间dp f[i][j][state] : [i, j]区间 state=0 当前选i state = 1 当前选j 注意枚举的顺序 转移的设计时 在同时刻不在[i,j]区间里的数也要考虑 不 ...
- 容易上手搭建vue2.0开发环境
第一步:安装node 前端开发框架和环境都是需要 Node.js ,先安装node.js开发环境,vue的运行是要依赖于node的npm的管理工具来实现,下载https://nodejs.org/en ...
- (十七)c#Winform自定义控件-基类窗体
前提 入行已经7,8年了,一直想做一套漂亮点的自定义控件,于是就有了本系列文章. 开源地址:https://gitee.com/kwwwvagaa/net_winform_custom_control ...
- Mysql优化(出自官方文档) - 第八篇(索引优化系列)
目录 Mysql优化(出自官方文档) - 第八篇(索引优化系列) Optimization and Indexes 1 Foreign Key Optimization 2 Column Indexe ...