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 ...
随机推荐
- Command 命令模式
简介 将来自客户端的请求传入一个对象,从而使你可用不同的请求对客户进行参数化.用于[行为请求者]与[行为实现者]解耦,可实现二者之间的松耦合,以便适应变化. 将一个请求封装为一个对象,从而使你可用不同 ...
- 9.7noip模拟试题
题目名称 日历游戏 最大公约数 密码 英文代号 calendar gcd pasuwado 输入文件名 calendar.in gcd.in pasuwado.in 输出文件名 calendar.ou ...
- 转载:浅析C#深拷贝与浅拷贝
原文地址 :http://www.cnblogs.com/xugang/archive/2010/09/09/1822555.html 感谢博主分享! 也许会有人这样解释C# 中浅拷贝与深拷贝区别 ...
- 关于AuthorizeAttribute使用
在开发中,假如你只对一个角色进行权限处理,你可以这么写 class ActionAuthAttribute : AuthorizeAttribute { private RoleType _roleT ...
- ASP.NET-FineUI开发实践-11
我用实例项目写了个子父页面传值,算是比较灵活的写法,可以把js提取出来写成包,然后调用,我先一步一步写,为有困难的朋友打个样. 先画个页面: 上面是个查询用的表单,底下是表格,内存分页,用到了VBox ...
- 关于php读mysql数据库时出现乱码的解决方法
关于php读mysql数据库时出现乱码的解决方法 php读mysql时,有以下几个地方涉及到了字符集. 1.建立数据库表时指定数据库表的字符集.例如 create table tablename ( ...
- Ext4.1 Grid 分页查询
转载:http://blog.csdn.net/zyujie/article/details/16362747 最近用Ext4.1自己做了做项目的练习:把一些知识点,在这里记录下来了! 上面一个for ...
- (转)mysql 的 find_in_set函数使用方法
举个例子来说: 有个文章表里面有个type字段,他存储的是文章类型,有 1头条,2推荐,3热点,4图文 .....11,12,13等等 现在有篇文章他既是 头条,又是热点,还是图文, type中以 1 ...
- codevs 1139 观光公交
#include<cstdio> #include<cstdlib> #include<cstring> #define max(a,b) (a > b ? ...
- 关闭C#主窗体弹出是否关闭对话框
在开发系统时,常常有这样一个问题,就是当关闭主窗体,也即退出系统时,如果想提示是否关闭,以免误操作,可以在主窗体的Main_FormClosing事件中添加一个对话框,代码如下: private vo ...