题意:从A走到B,有最短路,问这样不重复的最短路有几条

思路:先来讲选有效边,我们从start和end各跑一次最短路,得到dis1和dis2数组,如果dis1[u] + dis2[v] + cost[u][v] == dis1[end],那么uv这条边是最短路的一条边。然后我们选完边,把边加入ISAP,然后跑一边就行了...还没学过SAP只会敲模板....

错误思路:刚开始想的是先求出最短路,然后用费用流spfa去跑,边容量1,如果跑出一条路径费用等于最短路,那么路径+1,继续跑,但是超时了,看了半天是spfa跑费用流太慢的关系...等我学会网络流其他算法再来看这种emmm

代码:

#include<cstdio>
#include<set>
#include<cmath>
#include<stack>
#include<vector>
#include<queue>
#include<cstring>
#include<string>
#include<sstream>
#include<iostream>
#include<algorithm>
#define ll long long
using namespace std;
const int maxn = +;
const int INF = 0x3f3f3f3f; //网络流ISAP
struct Node{
int to,next,cap,flow;
}edge[];
int tot;
int head[maxn];
int gap[maxn],dep[maxn],pre[maxn],cur[maxn];
void init(){
tot = ;
memset(head,-,sizeof(head));
}
void addEdge(int u,int v,int w,int rw = ){
edge[tot].to = v;
edge[tot].cap = w;
edge[tot].flow = ;
edge[tot].next = head[u];
head[u] = tot++; edge[tot].to = u;
edge[tot].cap = rw;
edge[tot].flow = ;
edge[tot].next = head[v];
head[v] = tot++;
}
int sap(int start,int end,int N){
memset(gap,,sizeof(gap));
memset(dep,,sizeof(dep));
memcpy(cur,head,sizeof(head));
int u = start;
pre[u] = -;
gap[u] = N;
int ans = ;
while(dep[start] < N){
if(u == end){
int Min = INF;
for(int i = pre[u];i != -;i = pre[edge[i^].to]){
if(Min > edge[i].cap - edge[i].flow){
Min = edge[i].cap - edge[i].flow;
}
}
for(int i = pre[u];i != -;i = pre[edge[i^].to]){
edge[i].flow += Min;
edge[i^].flow -= Min;
}
u = start;
ans += Min;
continue;
}
bool flag = false;
int v;
for(int i = cur[u];i != -;i = edge[i].next){
v = edge[i].to;
if(edge[i].cap- edge[i].flow && dep[v] + == dep[u]){
flag = true;
cur[u] = pre[v] = i;
break;
}
}
if(flag){
u = v;
continue;
}
int Min = N;
for(int i = head[u];i != -;i = edge[i].next){
if(edge[i].cap - edge[i].flow && dep[edge[i].to] < Min){
Min = dep[edge[i].to];
cur[u] = i;
}
}
gap[dep[u]]--;
if(!gap[dep[u]]) return ans;
dep[u] = Min + ;
gap[dep[u]]++;
if(u != start) u = edge[pre[u]^].to;
}
return ans;
} struct road{
int v,cost,next;
}e[];
int head2[maxn],tol,MinPath;
void addRoad(int u,int v,int w){
e[tol].v = v;
e[tol].cost = w;
e[tol].next = head2[u];
head2[u] = tol++;
}
bool vis1[maxn];
int cnt[maxn],dist[maxn];
bool SPFA(int st,int n){
memset(vis1,false,sizeof(vis1));
for(int i = ;i <= n;i++) dist[i] = INF;
vis1[st] = true;
dist[st] = ;
queue<int> q;
while(!q.empty()) q.pop();
q.push(st);
memset(cnt,,sizeof(cnt));
cnt[st] = ;
while(!q.empty()){
int u = q.front();
q.pop();
vis1[u] = false;
for(int i = head2[u];i != -;i = e[i].next){
int v = e[i].v;
if(dist[v] > dist[u] + e[i].cost){
dist[v] = dist[u] + e[i].cost;
if(!vis1[v]){
vis1[v] = true;
q.push(v);
if(++cnt[v] > n) return false;
}
}
}
}
return true;
}
int dis1[maxn];
int u[],v[],w[];
int main(){
int n,m,T;
scanf("%d",&T);
while(T--){
init();
scanf("%d%d",&n,&m);
for(int i = ;i < m;i++){
scanf("%d%d%d",&u[i],&v[i],&w[i]);
}
int st,en;
scanf("%d%d",&st,&en);
tol = ;
memset(head2,-,sizeof(head2));
for(int i = ;i < m;i++){
addRoad(u[i],v[i],w[i]);
}
SPFA(st,n);
MinPath = dist[en];
memcpy(dis1,dist,sizeof(dist));
tol = ;
memset(head2,-,sizeof(head2));
for(int i = ;i < m;i++){
addRoad(v[i],u[i],w[i]);
}
SPFA(en,n);
for(int i = ;i < m;i++){
if(dis1[u[i]] + dist[v[i]] + w[i] == MinPath)
addEdge(u[i],v[i],);
}
int flow = sap(st,en,n);
printf("%d\n",flow);
}
return ;
}

HDU 3416 Marriage Match IV(ISAP+最短路)题解的更多相关文章

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

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

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

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

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

    题面 Do not sincere non-interference. Like that show, now starvae also take part in a show, but it tak ...

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

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

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

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

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

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

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

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

  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. shell ln

    功能:ln命令为某一个文件在另外一个位置建立一个同步的链接.当我们需要在不同的目录,用到相同的文件时,我们不需要在每一个需要的目录下都放一个必须相同的文件,我们只要在某个固定的目录,放上该文件,然后在 ...

  2. Shell主要逻辑源码级分析 (2)——SHELL作业控制

    版权声明:本文由李航原创文章,转载请注明出处: 文章原文链接:https://www.qcloud.com/community/article/110 来源:腾云阁 https://www.qclou ...

  3. highmaps如何自定义 区间的颜色刻度

    https://api.highcharts.com/highmaps/colorAxis.dataClassColor http://jsfiddle.net/gh/get/library/pure ...

  4. 小技巧------教你释放C盘空间

    1.删除休眠文件hiberfil.sys. 该文件在c盘根部目录为隐藏的系统文件,隐藏的这个hiberfil.sys文件大小正好和自己的物理内存是一致的,当你让电脑进入休眠状态时,windows7在关 ...

  5. PHP新版本变化

    世界变化真快,突然听闻 PHP 都到 7.3 版本了,7.2 还没仔细了解过呢.看到我司面试时会问到php新版本有什么特性,美名其曰考察其学习新技术的能力,我有点汗颜,自己都没有主动去了解过,实在不应 ...

  6. SaltStack部署redis主从

    需求: 一,部署redis主从,一台主一台从 二,redis监听自己的IP地址,而不是0.0.0.0 主:安装,配置,启动 从:安装,配置,启动,主从

  7. 集成tomcat插件到eclipse

    Eclipse中Tomcat的配置及简单例子 环境: 系统: Windows 7 64位专业版 Eclipse: Eclipse Java EE IDE for Web Developers.     ...

  8. drop user 报错ora-00604

    问题描述: SQL> show user USER is "SYS" SQL> drop user efmis_zhongyang cascade; drop user ...

  9. Team Formation---zoj3870(异或)

    题目链接:http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemId=5518 题意就是有n个数,如果满足a^b > MAX(a, b) ...

  10. Python开发【前端】:Ajax(二)

    原生Ajax.JQuery.伪Ajax三种方式使用优先级 如果发送的是[普通数据] jQuery XMLHttpRequest iframe 如果发送的是[文件] iframe jQuery(Form ...