ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

Marriage Match IV (双向SPFA+最大流) 求对短路个数

2019-07-26 12:08:39  阅读:277  来源: 互联网

标签:wedge wcnt int IV whead SPFA edge Marriage maxn


题目链接:https://cn.vjudge.net/problem/HDU-3416

/*
Marriage Match IV 
HDU - 3416
https://cn.vjudge.net/problem/HDU-3416
题意:  找出所有最短路的个数
解法:
双向SPFA枚举每条边找出最短路的连通图
最大流求最短路个数
*/
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<queue>
#include<iostream>
using namespace std;
#define INF 0x3f3f3f
#define maxn 100010
struct node{
  int u, v, w;
  int next;
}edge[maxn], uedge[maxn], wedge[maxn*2];
int head[maxn], uhead[maxn], whead[maxn];
int cnt, ucnt, wcnt;
int dis[maxn], udis[maxn];
int d[maxn];
int t,n,B,E;
void init(){
  memset(head, -1, sizeof head);
  memset(uhead, -1, sizeof uhead);
  memset(whead, -1, sizeof whead);
  memset(dis, INF, sizeof dis);
  memset(udis, INF, sizeof udis);
  cnt = ucnt = wcnt = 0;
}
void add(int u, int v, int w, node edge[], int  &cnt, int *head){
  edge[cnt].w=w;
  edge[cnt].u=u;
  edge[cnt].v=v;
  edge[cnt].next=head[u];
  head[u]=cnt++;
}
void add_dinic(int u,int v,int w){
  wedge[wcnt].w=w;
  wedge[wcnt].u=u;
  wedge[wcnt].v=v;
  wedge[wcnt].next=whead[u];
  whead[u]=wcnt++;

  wedge[wcnt].w=0;
  wedge[wcnt].u=v;
  wedge[wcnt].v=u;
  wedge[wcnt].next=whead[v];
  whead[v]=wcnt++;
}
void spfa(int st, int *dis, int *head, node edge[]){
  queue<int> q;
  bool color[maxn];
  memset(color,true,sizeof color);
  q.push(st);
  dis[st]=0;
  color[st]=false;
  while(!q.empty()){
    int u=q.front();
    q.pop();
    color[u]=true;
    for(int i=head[u];~i;i=edge[i].next){
      if(dis[u]+edge[i].w<dis[edge[i].v]){
        dis[edge[i].v]=dis[u]+edge[i].w;
        if(color[edge[i].v]){
            q.push(edge[i].v);
            color[edge[i].v]=false;
        }
      }
    }
  }
}
bool bfs(int B,int E){
  memset(d,-1,sizeof d);
  queue<int> q;
  d[B]=0;
  q.push(B);
  while(!q.empty()){
    int st=q.front();
    q.pop();
    for(int i=whead[st];~i;i=wedge[i].next){
      if(d[wedge[i].v]==-1&&wedge[i].w>0){
        d[wedge[i].v]=d[st]+1;
        q.push(wedge[i].v);
      }
    }
  }
  return d[E]!=-1;
}
int dfs(int a,int b){
  int r=0;
  if(a==E) return b;
  for(int i=whead[a];~i;i=wedge[i].next){
    if(wedge[i].w>0&&d[wedge[i].v]==d[a]+1){
      int x=min(wedge[i].w,b-r);
      x=dfs(wedge[i].v,x);
      r+=x;
      wedge[i].w-=x;
      wedge[i^1].w+=x;
    }
  }
  if(!r) d[a]=-2;
  return r;
}
int dinic(int B,int E){
  int ans=0;
  int t;
  while(bfs(B,E)){
    while(t=dfs(B,INF)) ans+=t;
  }
  return ans;
}
int main(){
  int T;
  scanf("%d", &T);
  while(T--){
    scanf("%d %d", &n, &t);
    init();
    for(int i=0;i<t;i++){
      int u,v,w;
      scanf("%d %d %d", &u, &v, &w);
      add(u, v, w, edge, cnt, head);
      add(v, u, w, uedge, ucnt, uhead);
    }
    scanf("%d %d", &B ,&E);
    spfa(B, dis, head, edge);
    if(dis[E]==INF){
      printf("0\n");
      continue;
    }
    long long tmp = dis[E];
    spfa(E, udis, uhead, uedge);
    for(int i=0;i<t;i++){
      int u=edge[i].u,v=edge[i].v;
      if(edge[i].w&&dis[u]+udis[v]+edge[i].w==tmp){
        add_dinic(u,v,1);
      }
    }
    printf("%d\n", dinic(B,E));
  }
  return 0;
}

标签:wedge,wcnt,int,IV,whead,SPFA,edge,Marriage,maxn
来源: https://blog.csdn.net/weixin_44410512/article/details/97376637

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有