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 ...
随机推荐
- 使用NAT方式连网的linux服务器虚拟机搭建
从一开始我就很纠结centos服务器搭建的过程. 由于自己方向并不在运维上,但是学习开发也需要用到Linux所以就一直没认真去学. 经过自己多方面摸索与学习找到了自己的一套方法. 首先我用到的是 ce ...
- python 之路,Day11 (下)- sqlalchemy ORM
python 之路,Day11 - sqlalchemy ORM 本节内容 ORM介绍 sqlalchemy安装 sqlalchemy基本使用 多外键关联 多对多关系 表结构设计作业 1. ORM ...
- win7/win8 64位系统注册TeeChart8.ocx 控件---以及dllregisterserver调用失败问题解决办法
TeeChart控件就不多介绍了,很多朋友不知道开始怎么注册使用,尤其是在64位系统下如何注册的问题,具体如下: win7.win8 64位系统问题所在: 64位的系统一般都是可以安装32位程序的 ...
- 使用MiniProfiler调试Asp.net Mvc性能
使用nuget添加MiniProfiler.EF组件 在Global文件中配置MiniProfiler protected void Application_Start() { AreaRegistr ...
- CSS 让标点符号不出现在行首
word-break:break-all; 这条语句的作用是让语句到达边界的时候自动换行,但是正是这个样式让标点符号跑到了行首. 语法: word-break : normal | break-all ...
- 各浏览器对 onbeforeunload 事件的支持与触发条件实现有差异
转载:http://www.w3help.org/zh-cn/causes/BX2047 标准参考 无. 问题描述 一般情况下,onbeforeunload 事件处理函数内会写入一些提示性语句,当用户 ...
- Android开发手记(16) 数据存储一 SharedPreferences
Android为数据存储提供了五种方式: 1.SharedPreferences 2.文件存储 3.SQLite数据库 4.ContentProvider 5.网络存储 SharedPreferenc ...
- MySQL拷贝表的几种方式
假如我们有以下这样一个表: id username password ----------------------------------- 1 admin * ...
- JavaScript--函数-01
函数的本质: function:创建一个函数对象的意思 什么是函数对象: 专门封装一个函数定义的存储空间 其实,函数是一个引用类型的对象 函数名,其实是一个引用函数对象的变量 函数只有在调用时才执行, ...
- AutoIt3初探(1)
AutoIt3可实现系统操作,键盘鼠标模拟,是自动化测试的一个好工具. 这个是在线帮助文档,http://www.jb51.net/shouce/autoit/ 需要先下载一个autoIt安装,然后将 ...