题目链接:http://acm.split.hdu.edu.cn/showproblem.php?pid=3416

有一个有向图,n个点,m条边,给一个起点和终点,求出从起点到终点的最短路共有几条,每条路只能走一次,每个点可以走多次;

先用spfa求出从起点到各点的距离dist,然后根据dist的值建立新的图,边权为1,套用Dinic模板求起点到终点的最大流即可;

#include <iostream>
#include <stdio.h>
#include <math.h>
#include <string.h>
#include <queue>
#include <stack>
#include <algorithm>
#include <map>
#include <string>
typedef long long LL;
#define INF 0x3f3f3f3f
#define met(a, b) memset(a, b, sizeof(a))
#define N 200005 using namespace std; struct node
{
int v, w, Next;
}G[N], e[N]; int n, m, dist[N], vis[N], A, B;
int l[N]; int Head[N], cnt;
void Add(int u, int v, int w)
{
G[cnt].v = v;
G[cnt].w = w;
G[cnt].Next = Head[u];
Head[u] = cnt++;
} int Head1[N], cnt1;
void Add1(int u, int v, int w)
{
e[cnt1].v = v;
e[cnt1].w = w;
e[cnt1].Next = Head1[u];
Head1[u] = cnt1++;
} void spfa()
{
for(int i=; i<=n; i++)
dist[i] = INF;
met(vis, );
queue<int>Q;
Q.push(A);
vis[A] = ;
dist[A] = ;
while(!Q.empty())
{
int p = Q.front();Q.pop();
vis[p] = ;
for(int i=Head[p]; i!=-; i=G[i].Next)
{
int q = G[i].v;
if(dist[q] > dist[p]+G[i].w)
{
dist[q] = dist[p]+G[i].w;
if(!vis[q])
{
vis[q] = ;
Q.push(q);
}
}
}
}
} bool bfs(int s, int End)
{
met(l, );
queue<int>Q;
Q.push(s);
l[s] = ;
while(!Q.empty())
{
int u = Q.front();Q.pop();
if(u == End)return true;
for(int i=Head1[u]; i!=-; i=e[i].Next)
{
int v = e[i].v;
if(!l[v] && e[i].w)
{
l[v] = l[u]+;
Q.push(v);
}
}
}
return false;
} int dfs(int u, int MaxFlow, int End)
{
if(u == End)return MaxFlow; int uflow = ; for(int j=Head1[u]; j!=-; j=e[j].Next)
{
int v = e[j].v;
if(l[v]==l[u]+ && e[j].w)
{
int flow = min(e[j].w, MaxFlow-uflow);
flow = dfs(v, flow, End);
e[j].w -= flow;
e[j^].w += flow;
uflow += flow;
if(uflow == MaxFlow)
break;
}
}
if(uflow == )
l[u] = ;
return uflow;
} int Dinic()
{
int MaxFlow = ;
while(bfs(A, B))
MaxFlow += dfs(A, INF, B);
return MaxFlow;
} int main()
{
int T;
scanf("%d", &T);
while(T--)
{
met(Head, -);
cnt = ;
met(Head1, -);
cnt1 = ; scanf("%d %d", &n, &m); for(int i=; i<=m; i++)
{
int u, v, w;
scanf("%d %d %d", &u, &v, &w);
if(u == v)continue;
Add(u, v, w);
}
scanf("%d %d", &A, &B); spfa();///更新dist; for(int i=; i<=n; i++)
{
for(int j=Head[i]; j!=-; j=G[j].Next)
{
int v = G[j].v;
if(dist[v] == dist[i]+G[j].w)///建立新的网络流图;
{
Add1(i, v, );
Add1(v, i, );
}
}
} int ans = Dinic();///求最大流即可; printf("%d\n", ans);
}
return ;
}

最新文章

  1. 你想要了解但是却羞于发问的有关SSL的一切
  2. SQL Server 快捷键备忘
  3. 基于ASP.NET MVC的热插拔模块式开发框架(OrchardNoCMS)--模块开发
  4. POJ 1062 ( dijkstra )
  5. paip.spring 获取bean getBean 没有beanid的情况下
  6. [原]编译Android源码过程中遇到的问题
  7. fedora20安装spin以及用户界面ispin
  8. 高效算法——D 贪心,区间覆盖问题
  9. WPF可视化控件打印
  10. CSS3实战开发:使用CSS3实现photoshop的过滤效果
  11. 【转载】__name__ == &quot;__main__&quot;: 你认识我么?
  12. android版本 busybox
  13. jenkins邮件设置
  14. 【struts2】ActionContext与ServletActionContext
  15. PHP垃圾回收机制
  16. 初学python之路-day11
  17. MySQL中实现连续日期内数据统计,缺省天数0补全
  18. Vue 加载外部js文件
  19. 如何解决PHP的高并发和大流量的问题
  20. ElasticSearch6(三)-- Java API实现简单的增删改查

热门文章

  1. HDU 4417 Super Mario(划分树+二分)
  2. hiho 光棍节
  3. NOIP200107统计单词个数
  4. Easyui的datagrid结合hibernate实现数据分页
  5. Odoo ir actions 分析
  6. How to override create,write,unlink method in Odoo v8
  7. SQLi filter evasion cheat sheet (MySQL)
  8. NodeJs - 序列化
  9. SonarQube代码质量管理平台安装与使用
  10. 安装nfs服务器