O - Marriage Match IV - hdu 3416(最短路+最大流)
#pragma comment(linker, "/STACK:102400000,102400000")
#include<stdio.h>
#include<string.h>
#include<queue>
#include<stack>
#include<vector>
using namespace std; const int MAXN = 1e6+;
const int MAXM = ;
const int oo = 1e9+;
///分别存正向图,反向图,和重构图
struct Edge{int v, val, next;}ss[MAXN], ee[MAXN], edge[MAXN<<];
int Hs[MAXM], He[MAXM], Head[MAXM], cnt_s, cnt_e, cnt;
int DistS[MAXM], DistE[MAXM];///分别是从源点到达每点的距离,和每点到达源点的距离
int Layer[MAXM];///分层 void InIt(int N)
{
cnt = cnt_e = cnt_s = ; memset(Hs, -, sizeof(Hs));
memset(He, -, sizeof(He));
memset(Head, -, sizeof(Head)); for(int i=; i<=N; i++)
DistE[i] = DistS[i] = oo;
}
void AddEdge(Edge e[], int head[], int &ct, int u, int v, int val)
{
e[ct].v = v;
e[ct].val = val;
e[ct].next = head[u];
head[u] = ct++;
}
void spfa(Edge e[], int head[], int dist[], int start)
{///求最短路
stack<int> sta;
bool instack[MAXM] = {};
dist[start] = ;
sta.push(start); while(sta.size())
{
int u = sta.top();sta.pop();
instack[u] = false; for(int j=head[u]; j!=-; j=e[j].next)
{
int v = e[j].v; if(dist[v] > dist[u]+e[j].val)
{
dist[v] = dist[u] + e[j].val; if(instack[v] == false)
{
instack[v] = true;
sta.push(v);
}
}
}
}
}
void BuildGraph(int u, int MinLen)
{///遍历所有的边,把输入最短路的边加入新图中
for(int j=Hs[u]; j!=-; j=ss[j].next)
{
int v = ss[j].v; if(v != -)
{
if(DistS[u] + DistE[v] + ss[j].val == MinLen)
{
AddEdge(edge, Head, cnt, u, v, );
AddEdge(edge, Head, cnt, v, u, );
} ss[j].v = -; BuildGraph(v, MinLen);
}
}
}
bool BFS(int start, int End)
{
memset(Layer, , sizeof(Layer));
Layer[start] = ;
queue<int> Q;
Q.push(start); while(Q.size())
{
int u = Q.front();Q.pop(); if(u == End)return true; for(int j=Head[u]; j!=-; j=edge[j].next)
{
int v = edge[j].v; if(Layer[v] == false && edge[j].val)
{
Layer[v] = Layer[u] + ;
Q.push(v);
}
}
} return false;
}
int DFS(int u, int MaxFlow, int End)
{
if(u == End)return MaxFlow; int uflow = ; for(int j=Head[u]; j!=-; j=edge[j].next)
{
int v = edge[j].v; if(Layer[u]+ == Layer[v] && edge[j].val)
{
int flow = min(MaxFlow-uflow, edge[j].val);
flow = DFS(v, flow, End); edge[j].val -= flow;
edge[j^].val += flow;
uflow += flow; if(uflow == MaxFlow)
break;
}
} if(uflow == )
Layer[u] = ; return uflow;
}
int Dinic(int start, int End)
{
int MaxFlow = ; while(BFS(start, End) == true)
MaxFlow += DFS(start, oo, End); return MaxFlow;
} int main()
{
int T; scanf("%d", &T); while(T--)
{
int N, M, u, v, val; scanf("%d%d", &N, &M);
InIt(N); while(M--)
{
scanf("%d%d%d", &u, &v, &val); if(u == v)continue; AddEdge(ss, Hs, cnt_s, u, v, val);
AddEdge(ee, He, cnt_e, v, u, val);
} int start, End; scanf("%d%d", &start, &End); spfa(ss, Hs, DistS, start);///求源点到所有点的距离
spfa(ee, He, DistE, End);///求所有点到汇点的最短距离
BuildGraph(start, DistS[End]);///构建新图 printf("%d\n", Dinic(start, End));
} return ;
}
O - Marriage Match IV - hdu 3416(最短路+最大流)的更多相关文章
- Marriage Match IV HDU - 3416(最短路 + 最大流)
题意: 求有多少条最短路 解析: 正着求一遍最短路 得dis1 反着求一遍得 dis2 然后 遍历所有的边 如果 dis1[u] + dis2[v] + w == dis1[B], 则说明这是一 ...
- Marriage Match IV HDU - 3416
题意 给你n个点,m条边,要求每条边只能走一次的S到T的最短路径的个数 题解 在我又WA又TLE还RE时,yyb大佬告诉我说要跑两遍SPFA,还说我写的一遍SPFA是错的,然而 啪啪打脸... 而且他 ...
- HDU 3416 Marriage Match IV (求最短路的条数,最大流)
Marriage Match IV 题目链接: http://acm.hust.edu.cn/vjudge/contest/122685#problem/Q Description Do not si ...
- Q - Marriage Match IV (非重复最短路 + Spfa + 网络最大流Isap)
Q - Marriage Match IV Do not sincere non-interference. Like that show, now starvae also take part in ...
- 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 show, now starvae ...
- HDU 3416 Marriage Match IV (最短路径,网络流,最大流)
HDU 3416 Marriage Match IV (最短路径,网络流,最大流) Description Do not sincere non-interference. Like that sho ...
- Marriage Match IV(最短路+网络流)
Marriage Match IV http://acm.hdu.edu.cn/showproblem.php?pid=3416 Time Limit: 2000/1000 MS (Java/Othe ...
- HDU3605:Marriage Match IV
Marriage Match IV Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others ...
随机推荐
- SPOJ 4053 - Card Sorting 最长不下降子序列
我们的男主现在手中有n*c张牌,其中有c(<=4)种颜色,每种颜色有n(<=100)张,现在他要排序,首先把相同的颜色的牌放在一起,颜色相同的按照序号从小到大排序.现在他想要让牌的移动次数 ...
- vsftp配置主动模式和被动模式
配置文件:/etc/vsftpd/vsftpd.conf 主动模式配置方法: 主动式连接使用的数据通道 connect_from_port_20=YES 支持数据流的被动式连接模式 pasv_enab ...
- zabbix图中出现中文乱码问题
我这周部署了zabbix监控服务器,但是配置过程中发现当有中文时,图中的中文会变成方块 如下图所示: 这个问题是由于zabbix的web端没有中文字库,我们最需要把中文字库加上即可 解决办法如下 1. ...
- 转载:C# 中的委托
原文地址 http://www.tracefact.net/CSharp-Programming/Delegates-and-Events-in-CSharp.aspx 感谢博主分享! 引言 委托和 ...
- Tab页签切换
js之tab页签切换效果 现在web网站,很多地都需要用到tab页签. 示例: $(document).ready(function(){ va ...
- 关于git的一些常用命令
1.git init 把目录变成Git可以管理的仓库 2.git add 把文件添加到仓库 3.git commit -m "" 把文件提交到仓库,-m后面是提交说明 4.git ...
- 有意思的字符串反转(JavaScript)
有意思的字符串反转 如果问你,实现对一串字符串进行反转操作,你的第一反应的方法是? 第一个我想到的是,利用Array.Reverse来实现: var test = 'Skylor.min'; test ...
- jdbc中的Statement对象和Preparedstatement对象的区别,以及通过jdbc操作调用存储过程
一. java.sql.* 和 javax.sql.*的包的类结构 |- Driver接口: 表示java驱动程序接口.所有的具体的数据库厂商要来实现此接口. |- connect(url, p ...
- JAVA-4-斐波列
public class Ch049 { public static void main(String[] args) { // TODO 自动生成的方法存根 int a = 1, b = 1; fo ...
- uvalive3026 Period (KMP+结论)
题目链接:http://vjudge.net/problem/viewProblem.action?id=29342 题目大意:给定字符串,找到每个前缀的最大循环节的个数. 首先当然是kmp预处理,接 ...