先求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. maven是什么?(转自oracle官网)

    Maven 是一个项目管理和构建自动化工具.但是对于我们程序员来说,我们最关心的是它的项目构建功能.所以这里我们介绍的就是怎样用 maven 来满足我们项目的日常需要.Maven 使用惯例优于配置的原 ...

  2. MFC对话框程序EDIT类控件的自动换行,垂直滚动条自动下移

    1.新建一个Edit Control,将其Multiline属性设置为True,Auto HScroll属性设置False,这样就可以实现每一行填满后自动换行了.   2.再将Vetrical Scr ...

  3. CentOS 6.4安装OpenOffice

    终端依次输入: (1)sudo yum install openoffice.org-writer (2) sudo  yum install openoffice.org-calc (3) sudo ...

  4. 学习笔记_第一个strut程序_之中文乱码,过滤器解决方案及过程总结

    1.  第一次碰到加过滤器的过程,就是在学习struct1的时候,中文乱码 几个需要注意的关键字 2.什么叫package 所谓package就是打包的意思,就是说以下程序都是处于这个包内,所以一开始 ...

  5. swift入门-day01

    Swift 简介 简介 Swift 语言由苹果公司在 2014 年推出,用来撰写 OS X 和 iOS 应用程序 2014 年,在 Apple WWDC 发布 历史 2010 年 7 月,苹果开发者工 ...

  6. objective-c内存管理中autorelease的作用

    //创建自动释放池 @autoreleasepool { //autorelease会将对象放入自动释放池中,并返回该对象本身 //当自动释放池销毁时,将自动调用对象的release方法 Person ...

  7. 九度OJ 1084 整数拆分

    题目地址:http://ac.jobdu.com/problem.php?pid=1084 题目描述: 一个整数总可以拆分为2的幂的和,例如: 7=1+2+4 7=1+2+2+2 7=1+1+1+4 ...

  8. AOP学习过程中遇到的问题汇总

    jdk版本问题:     在spring较低的版本中,仅支持jdk1.5到1.7版本,由于我本机安装的是jdk1.8,所以在调试的时候就会提示jdk版本要高于1.5.于是换成spring4.0,在co ...

  9. MySQL配置文件详解

    MYSQL 配置文件详解 “全局缓存”.“线程缓存”,全局缓存是所有线程共享,线程缓存是每个线程连接上数据时创建一个线程(如果没有设置线程池),假如有200连接.那就是200个线程,如果参数设定值是1 ...

  10. git ignore已经checked in files

    对于untracked file, 可以使用.gitignore 对于已经checked in file,可以使用git update-index #隐藏 git update-index --ass ...