【HDOJ】3416 Marriage Match IV
先求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的更多相关文章
- 【HDOJ】3277 Marriage Match III
Dinic不同实现的效率果然不同啊. /* 3277 */ #include <iostream> #include <string> #include <map> ...
- HDU 3416 Marriage Match IV (最短路径,网络流,最大流)
HDU 3416 Marriage Match IV (最短路径,网络流,最大流) Description Do not sincere non-interference. Like that sho ...
- 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 (求最短路的条数,最大流)
Marriage Match IV 题目链接: http://acm.hust.edu.cn/vjudge/contest/122685#problem/Q Description Do not si ...
- HDU 3416 Marriage Match IV 【最短路】(记录路径)+【最大流】
<题目链接> 题目大意: 给你一张图,问你其中没有边重合的最短路径有多少条. 解题分析: 建图的时候记得存一下链式后向边,方便寻找最短路径,然后用Dijkstra或者SPFA跑一遍最短路, ...
- hdu 3416 Marriage Match IV 【 最短路 最大流 】
求边不可重复的最短路条数 先从起点到终点用一次dijkstra,再从终点到起点用一次dijkstra,来判断一条边是否在最短路上 如果在,就将这条边的两个端点连起来,容量为1 再跑一下dinic(), ...
- SPFA+Dinic HDOJ 3416 Marriage Match IV
题目传送门 题意:求A到B不同最短路的条数(即边不能重复走, 点可以多次走) 分析:先从A跑最短路,再从B跑最短路,如果d(A -> u) + w (u, v) + d (B -> v) ...
- HDU 3416 Marriage Match IV dij+dinic
题意:给你n个点,m条边的图(有向图,记住一定是有向图),给定起点和终点,问你从起点到终点有几条不同的最短路 分析:不同的最短路,即一条边也不能相同,然后刚开始我的想法是找到一条删一条,然后光荣TLE ...
- HDU 3416 Marriage Match IV
最短路+最大流 #include<cstdio> #include<cstring> #include<string> #include<cmath> ...
随机推荐
- Android开发之ViewPager
什么是ViewPager? ViewPager是安卓3.0之后提供的新特性,继承自ViewGroup,专门用以实现左右滑动切换View的效果. 如果想向下兼容就必须要android-support-v ...
- Canvas实现曲线运动
前言 Html5添加的最受欢迎的功能就是<canvas>元素,它负责在页面中设定一个区域,然后在里面可以通过javascript动态地在其内绘制图形. 主流浏览器,IE9+,手机端都是支持 ...
- [转]SQL语句:Group By总结
1. Group By 语句简介: Group By语句从英文的字面意义上理解就是“根据(by)一定的规则进行分组(Group)”.它的作用是通过一定的规则将一个数据集划分成若干个小的区域,然后针对若 ...
- xcode插件安装完之后无法使用问题解决
1.打开xcode插件所在的目录: 例如: ~/wangdi/library/Application Support/Developer/Shared/Xcode/Plug-ins /Users/su ...
- 04_过滤器Filter_03_多个Filter的执行顺序
[Filter链] *在一个web应用中,可以开发编写多个Filter,这些Filter组合起来称为一个Filter链. *web服务器根据Filter在web.xml中的注册顺序,决定先调用哪个Fi ...
- php 验证码生成方法 及使用
基本思路是: 在生成图片的页面中(as: yzm.php)1.设置生成的图片的宽度和高度:2.设置图片要写入的字符:3.截取显示在图片上的字符;4.开启session,把上面截取的字符存放在sessi ...
- Spring Cloud Eureka Server例子程序
Spring-Cloud-Eureka-Server 及Client 例子程序 参考源代码:https://github.com/spring-cloud-samples/eureka 可以启动成功, ...
- php中文编码
header("Content-type: text/html; charset=utf-8"); header('Location: http://www.example.com ...
- linux重新增加硬盘容量
1.先用df -h查看硬盘使用情况 2.fdisk -l查看分区情况 表示还没有挂载 3.fdisk /dev/vdb进行分区 4.mkfs.ext3 /dev/vdb进行格式化 5.mount /d ...
- php接收二进制数据流转换成图片
<?php /** * 图片类 * @author Haroldphp@163.com * @version 1.0 * PHP默认只识别application/x-www.form-urlen ...