题意

给你n个点,m条边,要求每条边只能走一次的S到T的最短路径的个数


题解

在我又WA又TLE还RE时,yyb大佬告诉我说要跑两遍SPFA,还说我写的一遍SPFA是错的,然而

啪啪打脸。。。
而且他的

比我跑得慢,2333
接下来讲一下方法
首先一遍SPFA(或dijkstra)从S跑一遍到所有点的最短路,重新建图时对于每对u, v 若 dis[u] + w[u][v] == dis[v] 则加入这条边,容量为1(还要加反边),最后跑最大流即可,最大流我用的是Dinic,然后注意手打队列,系统的会TLE


常熟巨大的丑陋代码

# include <bits/stdc++.h>
# define RG register
# define IL inline
# define ll long long
# define mem(a, b) memset(a, b, sizeof(a))
# define Min(a, b) (((a) > (b)) ? (b) : (a))
# define Max(a, b) (((a) < (b)) ? (b) : (a))
using namespace std; IL int Get(){
RG char c = '!'; RG int x = 0, z = 1;
for(; c > '9' || c < '0'; c = getchar()) z = c == '-' ? -1 : 1;
for(; c <= '9' && c >= '0'; c = getchar()) x = x * 10 + c - '0';
return x * z;
} const int MAXN = 1001, MAXM = 200001, INF = 2147483647;
int n, m, ft[MAXN], cnt, ans, dis[MAXN], vis[MAXN], _ft[MAXN], level[MAXN], Q[MAXM];
struct Edge{
int to, f, nt;
} edge[MAXM], _edge[MAXM]; IL void Add(RG int u, RG int v, RG int f){
edge[cnt] = (Edge){v, f, ft[u]}; ft[u] = cnt++;
} IL void Add2(RG int u, RG int v, RG int f){
_edge[cnt] = (Edge){v, f, _ft[u]}; _ft[u] = cnt++;
} IL void SPFA(RG int S, RG int T){
RG int head = 0, tail = 0;
Q[0] = S; vis[S] = 1; dis[S] = 0;
while(head <= tail){
RG int u = Q[head++]; vis[u] = 0;
for(RG int e = ft[u]; e != -1; e = edge[e].nt){
RG int v = edge[e].to, f = edge[e].f + dis[u];
if(dis[v] > f){
dis[v] = f;
if(!vis[v]) vis[v] = 1, Q[++tail] = v;
}
}
}
} IL bool Bfs(RG int S, RG int T){
mem(level, 0);
RG int head = 0, tail = 0;
Q[0] = S; level[S] = 1;
while(head <= tail){
RG int u = Q[head++];
if(u == T) return 1;
for(RG int e = _ft[u]; e != -1; e = _edge[e].nt){
RG int v = _edge[e].to, f = _edge[e].f;
if(f && !level[v]){
level[v] = level[u] + 1;
Q[++tail] = v;
}
}
}
return 0;
} IL int Dfs(RG int u, RG int T, RG int maxf){
if(u == T) return maxf;
RG int res = 0;
for(RG int e = _ft[u]; e != -1; e = _edge[e].nt){
RG int v = _edge[e].to, f = _edge[e].f;
if(level[u] + 1 == level[v] && f){
f = Dfs(v, T, Min(f, maxf - res));
_edge[e].f -= f; _edge[e ^ 1].f += f;
res += f;
if(res == maxf) break;
}
}
return res;
} int main(){
RG int T = Get();
while(T--){
n = Get(); m = Get();
mem(ft, -1); mem(dis, 63); mem(_ft, -1); ans = cnt = 0;
for(RG int i = 1; i <= m; i++){
RG int u = Get(), v = Get(), f = Get();
if(u == v) continue;
Add(u, v, f);
}
RG int S = Get(), T = Get(); cnt = 0;
SPFA(S, T);
for(RG int i = 1; i <= n; i++)
for(RG int e = ft[i]; e != -1; e = edge[e].nt)
if(dis[i] + edge[e].f == dis[edge[e].to])
Add2(i, edge[e].to, 1), Add2(edge[e].to, i, 0);
while(Bfs(S, T)) ans += Dfs(S, T, INF);
printf("%d\n", ans);
}
return 0;
}

Marriage Match IV HDU - 3416的更多相关文章

  1. O - Marriage Match IV - hdu 3416(最短路+最大流)

    题目大意:在城市A的男孩想去城市B的女孩,不过他去城市B必须走最短路,并且走过的路不可以再走,问他最多能看这个女孩多少次.   分析:因为这个男孩直走最短路,所以我们必须求出来所有最短路径上的路,怎么 ...

  2. Marriage Match IV HDU - 3416(最短路 + 最大流)

    题意: 求有多少条最短路 解析: 正着求一遍最短路 得dis1 反着求一遍得 dis2   然后 遍历所有的边 如果  dis1[u] + dis2[v] + w == dis1[B], 则说明这是一 ...

  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 (求最短路的条数,最大流)

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

  6. Marriage Match IV(最短路+网络流)

    Marriage Match IV http://acm.hdu.edu.cn/showproblem.php?pid=3416 Time Limit: 2000/1000 MS (Java/Othe ...

  7. HDU3605:Marriage Match IV

    Marriage Match IV Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others ...

  8. HDU3416 Marriage Match IV —— 最短路径 + 最大流

    题目链接:https://vjudge.net/problem/HDU-3416 Marriage Match IV Time Limit: 2000/1000 MS (Java/Others)    ...

  9. Q - Marriage Match IV (非重复最短路 + Spfa + 网络最大流Isap)

    Q - Marriage Match IV Do not sincere non-interference. Like that show, now starvae also take part in ...

随机推荐

  1. JSON工具类

    import java.sql.Timestamp; import java.util.Collection; import java.util.Date; import org.soul.util. ...

  2. 一步一步配置ABP Core Template with Angular

    1.首先去https://aspnetboilerplate.com/Templates下载模板工程,按如下勾选 2.下载后打开工程如下图,并设置Web.host 作为启动项目,rebuild 还原n ...

  3. “茴”字有四种写法,this也是一样

    说到这个地方又想起以前高中还是初中学的<孔乙己>这个梗,但是这里的this显然实用性比那个要大很多,哈哈. 简单来说,this有四种应用场景,分别是在构造函数上.对象属性中.普通函数中.c ...

  4. 揽货最短路径解决方案算法 - C# 蚁群优化算法实现

    需求为(自己编的,非实际项目): 某配送中心进行揽货,目标客户数为50个客户,配送中心目前的运力资源如下: 现有车辆5台 单台运力最大行驶距离200千米 单台运力最大载重公斤1吨 问:运力怎样走法才能 ...

  5. 自制PHP高防防盗链(不是一般的高)(思路)

    原理:根据IP,资源ID,时间戳,一次性Access_Token,APPKEY(暴露在前台)和APPSERECT(后台)来生成参数,具体见下面: 浏览器请求页面=>后台引用防盗链代码=>生 ...

  6. iBrand 产品工具包:Laravel Database Logger

    iBrand 社交新零售电商产品从2016年9月启动至今,已经趋于稳定,而且已经初步得到市场的检验,特别能抗住电商中秒杀时高并发的交易场景. 接下来我们团队会逐步开源一些正在使用的工具和解决方案,并且 ...

  7. 关于adb is down 的两个解决方案

    在Android开发过程中经常遇到这样的一个问题,The connection to adb is down, and a severe error has occured. 解决方案一: 1.为了以 ...

  8. R语言︱文本挖掘——词云wordcloud2包

    每每以为攀得众山小,可.每每又切实来到起点,大牛们,缓缓脚步来俺笔记葩分享一下吧,please~ --------------------------- 笔者看到微信公众号探数寻理中提到郎大为Chif ...

  9. 【mysql】mysql密码设置和更改

    密码设置: 当用户没有设置密码时: 添加密码: mysqladmin -uroot -password ab12 注:因为开始时root没有密码,所以-p旧密码一项就可以省略了. 当用户存在密码时: ...

  10. FusionCharts多数据验证饼图label是否重叠

    昨天,有人问我一个问题:由于饼图的数据太多,label标签上的汉字过多,导致重叠,该怎么解决? 今天我用大量的数据,label标签的字符也很多,但是通过验证没有发现有重叠的情况啊! 1.验证的JSP页 ...