先求SPSS。然后遍历每条边,检查是否为最短路径的边,如果是(dis[v]==dis[u]+w)则加入到网络流中。最后Dinic最大流.

 /* 3416 */
#include <iostream>
#include <string>
#include <map>
#include <queue>
#include <set>
#include <stack>
#include <vector>
#include <deque>
#include <algorithm>
#include <cstdio>
#include <cmath>
#include <ctime>
#include <cstring>
#include <climits>
#include <cctype>
#include <cassert>
#include <functional>
#include <iterator>
#include <iomanip>
using namespace std;
//#pragma comment(linker,"/STACK:102400000,1024000") #define sti set<int>
#define stpii set<pair<int, int> >
#define mpii map<int,int>
#define vi vector<int>
#define pii pair<int,int>
#define vpii vector<pair<int,int> >
#define rep(i, a, n) for (int i=a;i<n;++i)
#define per(i, a, n) for (int i=n-1;i>=a;--i)
#define clr clear
#define pb push_back
#define mp make_pair
#define fir first
#define sec second
#define all(x) (x).begin(),(x).end()
#define SZ(x) ((int)(x).size())
#define lson l, mid, rt<<1
#define rson mid+1, r, rt<<1|1 const int INF = 0x1f1f1f1f;
const int maxn = ;
const int maxe = ;
int head[maxn], nxt[maxe], V[maxe], F[maxe];
int head_[maxn], nxt_[maxe], V_[maxe], W[maxe];
int dis[maxn], pre[maxn], ID[maxn];
bool visit[maxn];
int n, m; void addEdge_(int u, int v, int w) {
V_[m] = v;
W[m] = w;
nxt_[m] = head_[u];
head_[u] = m++;
} void addEdge(int u, int v, int c) {
V[m] = v;
F[m] = c;
nxt[m] = head[u];
head[u] = m++; V[m] = u;
F[m] = ;
nxt[m] = head[v];
head[v] = m++;
} void spfa(int u) {
int v, k;
queue<int> Q; memset(dis, 0x1f, sizeof(dis));
memset(visit, false, sizeof(visit));
Q.push(u);
dis[u] = ;
visit[u] = true; while (!Q.empty()) {
u = Q.front();
Q.pop();
visit[u] = false;
for (k=head_[u]; k!=-; k=nxt_[k]) {
v = V_[k];
if (dis[v] > dis[u]+W[k]) {
dis[v] = dis[u] + W[k];
if (!visit[v]) {
visit[v] = true;
Q.push(v);
}
}
}
}
} bool bfs(int s, int t) {
queue<int> Q;
int u, v, k; memset(dis, , sizeof(dis));
Q.push(s);
dis[s] = ;
pre[s] = s; while (!Q.empty()) {
u = Q.front();
Q.pop();
for (k=head[u]; k!=-; k=nxt[k]) {
v = V[k];
if (F[k] && !dis[v]) {
dis[v] = dis[u] + ;
pre[v] = u;
ID[v] = k;
Q.push(v);
}
}
} return dis[t] == ;
} int dfs(int u, int t, int val) {
if (u==t || val==)
return val; int ret = , tmp;
int v, k; for (k=head[u]; k!=-; k=nxt[k]) {
v = V[k];
if (dis[v]==dis[u]+ && F[k] && (tmp=dfs(v, t, min(val, F[k])))>) {
F[k] -= tmp;
F[k^] += tmp;
ret += tmp;
val -= tmp;
if (val == )
break;
}
} return ret;
} int Dinic(int s, int t) {
int ret = , tmp; while () {
if (bfs(s, t))
break; tmp = dfs(s, t, INF);
ret += tmp;
} return ret;
} int main() {
ios::sync_with_stdio(false);
#ifndef ONLINE_JUDGE
freopen("data.in", "r", stdin);
freopen("data.out", "w", stdout);
#endif int tt;
int s, t, n_, m_;
int u, v, k, w;
int ans; scanf("%d", &tt);
while (tt--) {
scanf("%d %d", &n_, &m_);
memset(head_, -, sizeof(head_));
m = ;
while (m_--) {
scanf("%d %d %d", &u, &v, &w);
if (u != v)
addEdge_(u, v, w);
} scanf("%d %d", &s, &t);
spfa(s); m = ;
memset(head, -, sizeof(head));
rep(i, , n_+) {
for (k=head_[i]; k!=-; k=nxt_[k]) {
v = V_[k];
if (dis[v] == dis[i] + W[k]) {
addEdge(i, v, );
}
}
} ans = Dinic(s, t);
printf("%d\n", ans);
} #ifndef ONLINE_JUDGE
printf("time = %d.\n", (int)clock());
#endif return ;
}

【HDOJ】3416 Marriage Match IV的更多相关文章

  1. 【HDOJ】3277 Marriage Match III

    Dinic不同实现的效率果然不同啊. /* 3277 */ #include <iostream> #include <string> #include <map> ...

  2. HDU 3416 Marriage Match IV (最短路径,网络流,最大流)

    HDU 3416 Marriage Match IV (最短路径,网络流,最大流) Description Do not sincere non-interference. Like that sho ...

  3. hdu 3416 Marriage Match IV (最短路+最大流)

    hdu 3416 Marriage Match IV Description Do not sincere non-interference. Like that show, now starvae ...

  4. HDU 3416 Marriage Match IV (求最短路的条数,最大流)

    Marriage Match IV 题目链接: http://acm.hust.edu.cn/vjudge/contest/122685#problem/Q Description Do not si ...

  5. HDU 3416 Marriage Match IV 【最短路】(记录路径)+【最大流】

    <题目链接> 题目大意: 给你一张图,问你其中没有边重合的最短路径有多少条. 解题分析: 建图的时候记得存一下链式后向边,方便寻找最短路径,然后用Dijkstra或者SPFA跑一遍最短路, ...

  6. hdu 3416 Marriage Match IV 【 最短路 最大流 】

    求边不可重复的最短路条数 先从起点到终点用一次dijkstra,再从终点到起点用一次dijkstra,来判断一条边是否在最短路上 如果在,就将这条边的两个端点连起来,容量为1 再跑一下dinic(), ...

  7. SPFA+Dinic HDOJ 3416 Marriage Match IV

    题目传送门 题意:求A到B不同最短路的条数(即边不能重复走, 点可以多次走) 分析:先从A跑最短路,再从B跑最短路,如果d(A -> u) + w (u, v) + d (B -> v) ...

  8. HDU 3416 Marriage Match IV dij+dinic

    题意:给你n个点,m条边的图(有向图,记住一定是有向图),给定起点和终点,问你从起点到终点有几条不同的最短路 分析:不同的最短路,即一条边也不能相同,然后刚开始我的想法是找到一条删一条,然后光荣TLE ...

  9. HDU 3416 Marriage Match IV

    最短路+最大流 #include<cstdio> #include<cstring> #include<string> #include<cmath> ...

随机推荐

  1. 命令精解之DOS批处理

    前言 最近对于批处理技术的探讨比较热,也有不少好的批处理程序发布,但是如果没有一定的相关知识恐怕不容易看懂和理解这些批处理文件,也就更谈不上自己动手编写了,古语云:“授人以鱼,不如授人以渔.”因为网上 ...

  2. select random item with weight 根据权重随机选出

    http://eli.thegreenplace.net/2010/01/22/weighted-random-generation-in-python/ 类似俄罗斯轮盘赌

  3. 关于cnpm的一点小bug

    在实际工作中,一个项目完成后,在上线前,常常需要把代码进行压缩,一般是用gulp或者 webpack 进行压缩.(小妹是用gulp) gulp是运行在node 环境下的. 所以首先,下载并安装了nod ...

  4. Codevs 2843 拯救炜哥

    2843 拯救炜哥 时间限制: 2 s 空间限制: 128000 KB 题目等级 : 黄金 Gold 题目描述 Description 有一天,炜哥和欧能干一起去大魔王家里做(dao)客(luan), ...

  5. bzoj1260[CQOI2007]涂色paint

    思路:区间dp,用f[i][j]表示区间[i,j]的答案,然后转移即可. #include<iostream> #include<cstdio> #include<cst ...

  6. Lambda Expression In Java

     题记在阅读JDK源码java.util.Collections的时候在UnmodifiableCollection类中看到了这么一段代码: public void forEach(Consumer& ...

  7. html5有什么布局标签

    header h1 nav ul li a section(id) div h3 article figure img article h4 header time datetime='' body ...

  8. nginx服务器的日志太多:定期执行脚本删除

    #!/bin/bash -type f -name *.log | xargs rm -f 脚本名字autodellog.sh 设置定时器(每天凌晨一点执行) [root@localhost ~]# ...

  9. js获取url的get传值函数

    function getvl(name) { var reg = new RegExp("(^|\\?|&)"+ name +"=([^&]*)(\\s| ...

  10. Linux命令 &与&&的作用

    1.ls &表示后台服务 2.ls && ll 表示前者执行成功,执行后台命令