HDU - 3416:http://acm.hdu.edu.cn/showproblem.php?pid=3416

参考:https://www.cnblogs.com/kuangbin/archive/2013/05/04/3059372.html

题意:

   问一个带权值的图中,最多能跑几次最短路,每条路只能走一遍。

思路:

  这道题要利用最大流算法和最短路算法。先要跑两遍dji(),第一遍跑从起点S开始跑一遍正图,第二遍从终点T跑一遍反图。这样后枚举每一条边,看这条边的起点到S的距离+这条边的终点到T的距离+这条边长 == 最短路,如果成立,就把这条边 的容量设为1,加入网络流的图中。最后跑一下最大流就行了。

  自己在枚举点的时候没有搞清楚终点是T,wa了好几发。

#include <algorithm>
#include <iterator>
#include <iostream>
#include <cstring>
#include <cstdlib>
#include <iomanip>
#include <bitset>
#include <cctype>
#include <cstdio>
#include <string>
#include <vector>
#include <stack>
#include <cmath>
#include <queue>
#include <list>
#include <map>
#include <set>
#include <cassert>
using namespace std;
//#pragma GCC optimize(3)
//#pragma comment(linker, "/STACK:102400000,102400000") //c++
#define lson (l , mid , rt << 1)
#define rson (mid + 1 , r , rt << 1 | 1)
#define debug(x) cerr << #x << " = " << x << "\n";
#define pb push_back
#define pq priority_queue typedef long long ll;
typedef unsigned long long ull; typedef pair<ll ,ll > pll;
typedef pair<int ,int > pii;
typedef pair<int,pii> p3; //priority_queue<int> q;//这是一个大根堆q
//priority_queue<int,vector<int>,greater<int> >q;//这是一个小根堆q
#define fi first
#define se second
//#define endl '\n' #define OKC ios::sync_with_stdio(false);cin.tie(0)
#define FT(A,B,C) for(int A=B;A <= C;++A) //用来压行
#define REP(i , j , k) for(int i = j ; i < k ; ++i)
//priority_queue<int ,vector<int>, greater<int> >que; const ll mos = 0x7FFFFFFF; //
const ll nmos = 0x80000000; //-2147483648
const int inf = 0x3f3f3f3f;
const ll inff = 0x3f3f3f3f3f3f3f3f; //
const int mod = 1e9+;
const double esp = 1e-;
const double PI=acos(-1.0); template<typename T>
inline T read(T&x){
x=;int f=;char ch=getchar();
while (ch<''||ch>'') f|=(ch=='-'),ch=getchar();
while (ch>=''&&ch<='') x=x*+ch-'',ch=getchar();
return x=f?-x:x;
} /*-----------------------showtime----------------------*/
const int maxn = 2e5+;
int n,m,c,ans; int dis[][maxn];
vector<pii>g[][maxn];
//dji
void dji(int f,int soc){
for(int i=; i<=n; i++)dis[f][i] = inf; priority_queue<pii>que;
dis[f][soc] = ;
que.push(pii(,soc)); while(!que.empty()){
pii tmp = que.top();que.pop();
int u = tmp.se;
if(dis[f][u] < -*tmp.fi)continue;
for(int i=; i<g[f][u].size(); i++){
int v = g[f][u][i].fi;
if(dis[f][v] > dis[f][u] + g[f][u][i].se)
{
dis[f][v] = dis[f][u] + g[f][u][i].se;
que.push(pii(-*dis[f][v], v));
}
}
}
}
const int maxm = 1e6+;
struct Edge
{
int u,v,cap;
Edge(){}
Edge(int u,int v,int cap):u(u),v(v),cap(cap){}
}es[maxm];
int R,S,T;
vector<int>tab[maxn];
int diss[maxn],current[maxn];
void addedge(int u,int v,int cap){
tab[u].pb(R);
es[R++] = Edge(u,v,cap);
tab[v].pb(R);
es[R++] = Edge(v,u,);
}
bool BFS(){
queue<int>q;q.push(S);
memset(diss,inf,sizeof(diss));
diss[S] = ;
while(!q.empty()){
int h = q.front();q.pop();
for(int i=; i<tab[h].size(); i++){
Edge & e = es[tab[h][i]];
if(e.cap> &&diss[e.v] == inf){
diss[e.v] = diss[h] + ;
q.push(e.v);
}
}
}
return diss[T] < inf;
} int DFS(int x,int maxflow){
if(x == T){
return maxflow;
}
for(int i=current[x]; i<tab[x].size(); i++){
current[x] = i;
Edge &e = es[tab[x][i]];
if(diss[e.v] == diss[x] + && e.cap > ){
int flow = DFS(e.v, min(maxflow, e.cap));
if(flow>){
e.cap -= flow;
es[tab[x][i] ^ ].cap += flow;
return flow;
}
}
}
return ;
}
int dinic(){
int ans = ;
while(BFS()){
int flow;
memset(current,,sizeof(current));
while(true){
flow = DFS(S,inf);
if(flow > ) ans += flow;
else break;
}
}
return ans;
} int main(){
int t;scanf("%d" , &t); while(t--){ scanf("%d%d", &n, &m);
for(int i=; i<=n; i++)g[][i].clear(),g[][i].clear(),tab[i].clear();
for(int i=; i<=m; i++){
int u,v,c;
scanf("%d%d%d", &u, &v, &c);
if(v == u)continue;
g[][u].pb(pii(v,c));
g[][v].pb(pii(u,c));
}
scanf("%d%d", &S, &T); dji(,S),dji(,T);
// debug(dis[0][n]);
R = ;
for(int i=; i<=n; i++){
for(int j=; j<g[][i].size(); j++){
int u = i,v = g[][i][j].fi;
if(u!=v && dis[][T] == dis[][u] + dis[][v] + g[][i][j].se){
addedge(u,v,);
}
}
}
printf("%d\n", dinic());
}
return ;
}

HDU - 3416

HDU - 3416-Marriage Match IV (最大流 + 最短路)的更多相关文章

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

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

  2. HDU 3416 Marriage Match IV(ISAP+最短路)题解

    题意:从A走到B,有最短路,问这样不重复的最短路有几条 思路:先来讲选有效边,我们从start和end各跑一次最短路,得到dis1和dis2数组,如果dis1[u] + dis2[v] + cost[ ...

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

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

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

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

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

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

  6. HDU 3416 Marriage Match IV (Dijkstra+最大流)

    题意:N个点M条边的有向图,给定起点S和终点T,求每条边都不重复的S-->T的最短路有多少条. 分析:首先第一步需要找出所有可能最短路上的边.怎么高效地求出呢?可以这样:先对起点S,跑出最短路: ...

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

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

  8. HDU 3416 Marriage Match IV (最短路建图+最大流)

    (点击此处查看原题) 题目分析 题意:给出一个有n个结点,m条单向边的有向图,问从源点s到汇点t的不重合的最短路有多少条,所谓不重复,意思是任意两条最短路径都不共用一条边,而且任意两点之间的边只会用一 ...

  9. HDU 3416 Marriage Match IV (最短路径&&最大流)

    /*题意: 有 n 个城市,知道了起点和终点,有 m 条有向边,问从起点到终点的最短路一共有多少条.这是一个有向图,建边的时候要注意!!解题思路:这题的关键就是找到哪些边可以构成最短路,其实之前做最短 ...

  10. HDU 3416 Marriage Match IV dij+dinic

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

随机推荐

  1. SQL语句中的as

  2. pyhthon字典练习题

    pyhthon字典练习题: 有如下集合: [11,22,33,44,55,66,77,88,99] 将所有大于55的值保存至第一个KEY值中,将所有小于55的值保存至第二个KEY值中.{"k ...

  3. Ubuntu中修改默认开机项

    1首先,按住Ctrl+Alt+t打开终端 2输入cd /etc/default 3输入sudo sudo nano grub 并按照提示输入密码 4在我们开机的时候,可以看到自己想要默认的开机项是多少 ...

  4. c#将字符串转化为合理的文件名

    string name = System.Text.RegularExpressions.Regex.Replace(url, "[<>/\\|:\"?*]" ...

  5. 【译】尝试使用Nullable Reference Types

    随着.NET Core 3.0 Preview 7的发布,C#8.0已被认为是“功能完整”的.这意味着它们的最大亮点Nullable Reference Types,在行为方面也被锁定在.NET Co ...

  6. xpath爬虫实例,爬取图片网站百度盘地址和提取码

    某套图网站,套图以封面形式展现在页面,需要依次点击套图,点击广告盘链接,最后到达百度网盘展示页面. 这一过程通过爬虫来实现,收集百度网盘地址和提取码,采用xpath爬虫技术 1.首先分析图片列表页,该 ...

  7. Excel批量导入(导出同理)

    在做JavaWeb中添加数据使我们在所难免会遇到的,在大数据的环境下批量添加和批量删除是必须的,而批量删除只需要获取到我们需要删除的ID就可以了,在批量添加中我们就会遇到问题,问题是得到批量的数据,这 ...

  8. JavaWeb购物车

    一.类关系 最近又把JavaWeb方面的知识(Servlet.jsp等)过了一遍,发现以前还是接触的太窄太浅.加上才转到IntelliJ IDEA 上故而想用这个项目练练,就当熟悉熟悉IntelliJ ...

  9. 编译Assimp傻瓜教程

    assimp的编译过程和搭建OpenGL环境时glfw的编译基本相同,建议先阅读环境搭建 下载源码 这里使用的是3.3.1版本,Github下载assimp源码 解压完你会得到 接下来我们要编译这些源 ...

  10. Django Mysql数据库-F查询和Q查询

    一.F查询和Q查询 F查询: 在上面所有的例子中,我们构造的过滤器都只是将字段值与某个常量做比较.如果我们要对两个字段的值做比较,那该怎么做呢? Django 提供 F() 来做这样的比较.F() 的 ...