//给一个图。给定起点和终点,仅仅能走图上的最短路

//问最多有多少种走的方法。每条路仅仅能走一次

//仅仅要将在最短路上的全部边的权值改为1。求一个最大流即可

#include<cstdio>

#include<cstring>

#include<iostream>

#include<queue>

#include<vector>

using namespace std ;

const int inf = 0x3f3f3f3f ;

const int maxn = 1010 ;

const int maxm = 1e5+10 ;

int head[maxn] ;

int dis[maxn] ;int n , m ;

int st , en ;int len ;

int nedge ;

int x[maxm] , y[maxm] , z[maxm];

int vis[maxm] ;

struct Edge

{

    int v , w ;

    int next ;

}edge[maxm<<1] ;

void addedge(int u , int v , int w)

{

    edge[nedge].v = v ;

    edge[nedge].w = w ;

    edge[nedge].next = head[u] ;

    head[u] = nedge++ ;

}

void spfa()

{

    memset(vis , 0 , sizeof(vis)) ;

    queue<int> que ;

    for(int i = 1;i <= n;i++)

    dis[i] = i == st ?

0 : inf ;

    que.push(st) ;vis[st] = 1;

    while(que.size())

    {

        int u = que.front();que.pop() ;

        vis[u] = 0 ;

        for(int i = head[u];i != -1 ;i = edge[i].next)

        {

            int v = edge[i].v ;

            if(dis[u] + edge[i].w < dis[v])

            {

                dis[v] = dis[u] + edge[i].w ;

                if(!vis[v])

                {

                    que.push(v) ;

                    vis[v] = 1;

                }

            }

        }

    }

}

bool bfs()

{

    memset(dis , -1 , sizeof(dis)) ;

    dis[st] = 0 ;

    queue<int> que ;

    que.push(st) ;

    while(que.size())

    {

        int u = que.front();que.pop() ;

        for(int i = head[u];i != -1 ;i = edge[i].next)

        {

            int v = edge[i].v ;

            if(dis[v] < 0 && edge[i].w > 0)

            {

                dis[v] = dis[u] + 1 ;

                que.push(v) ;

            }

        }

    }

    if(dis[en] > 0)return true ;

    return false ;

}

int dfs(int u , int mx)

{

    if(u == en)return mx ;

    int ans = 0 , a ;

    for(int i = head[u];i != -1 ;i = edge[i].next)

    {

        int v = edge[i].v ;

        if(dis[v] == dis[u] + 1 && edge[i].w > 0 && (a = dfs(v , min(mx , edge[i].w))))

        {

            mx -= a ;

            ans += a ;

            edge[i].w -= a ;

            edge[i^1].w += a ;

            if(!mx)break;

        }

    }

    if(!ans)dis[u] = -1 ;

    return ans ;

}

int main()

{

    //freopen("in.txt" , "r" , stdin) ;

    int t ;

    scanf("%d" , &t) ;

    while(t--)

    {

        scanf("%d%d" , &n , &m);

        memset(head , -1 , sizeof(head)) ;

        nedge = 0 ;len = 0 ;

        while(m--)

        {

            int u , v , w ;

            scanf("%d%d%d" , &u , &v , &w) ;

            if(u != v)

            {

                addedge(u , v , w) ;

                x[len] = u , y[len] = v ,z[len++] = w ;

            }

        }

        scanf("%d%d" , &st , &en) ;

        spfa() ;

        memset(head , -1 , sizeof(head)) ;

        nedge = 0 ;

        for(int i = 0;i < len;i++)

        if(dis[x[i]] + z[i] == dis[y[i]])

        {

            addedge(x[i] , y[i] , 1) ;

            addedge(y[i] , x[i] , 0) ;

        }

        int ans = 0 ;

        int res ;

        while(bfs())

          while(res = dfs(st , inf))

            ans += res ;

        printf("%d\n" , ans) ;

    }

    return 0 ;

}

hdu3461Marriage Match IV 最短路+最大流的更多相关文章

  1. HDU-3416 Marriage Match IV 最短路+最大流 找各最短路的所有边

    题目链接:https://cn.vjudge.net/problem/HDU-3416 题意 给一个图,求AB间最短路的条数(每一条最短路没有重边.可有重复节点) 思路 首先把全部最短路的边找出来,再 ...

  2. hdu3416 Marriage Match IV 最短路+ 最大流

    此题的大意:给定一幅有向图,求起点到终点(都是固定的)的不同的最短路有多少条.不同的最短路是说不能有相同的边,顶点可以重复.并且图含有平行边. 看了题以后,就想到暴力,但是暴力往往是不可取的.(暴力的 ...

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

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

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

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

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

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

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

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

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

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

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

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

  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. 18/9/16牛客网提高组Day2

    牛客网提高组Day2 T1 方差 第一眼看就知道要打暴力啊,然而并没有想到去化简式子... 可能因为昨晚没睡好,今天上午困死 导致暴力打了一个半小时,还不对... #include <algor ...

  2. JavaScript学习总结(3)——JavaScript函数(function)

    一.函数基本概念 为完成某一功能的程序指令(语句)的集合,称为函数. 二.JavaScript函数的分类 1.自定义函数(我们自己编写的函数),如:function funName(){} 2.系统函 ...

  3. springMVC通过ajax传递参数list对象或传递数组对象到后台

    springMVC通过ajax传递参数list对象或传递数组对象到后台 环境: 前台传递参数到后台 前台使用ajax 后台使用springMVC 传递的参数是N多个对象 JSON对象和JSON字符串 ...

  4. 【hdu 6000】Wash

    [链接] 我是链接,点我呀:) [题意] 在这里输入题意 [题解] 因为每件衣服都是没有区别的. 只有洗衣机不同会影响洗衣时间. 那么我们把每台洗衣机洗衣的时间一开始都加入到队列中. 比如{2,3,6 ...

  5. Android 网络图片Url 转 Bitmap

    注意:该方法必须要在子线程中调用,因为涉及网络请求 public Bitmap getBitmap(String url) { Bitmap bm = null; try { URL iconUrl ...

  6. 用static 创建类的单例

    1.0 说明 通过函数调用new的static 类对象,由于static 对象只能初始化一次,由此构成单例运行. 2.0  直接代码 代码为windows,win32工程,因为只有一个文件,不上传工程 ...

  7. 【AtCoder Beginner Contest 074 D】Restoring Road Network

    [链接]h在这里写链接 [题意] 给你任意两点之间的最短路. 让你求出原图. 或者输出原图不存在. 输出原图的边长总和的最小值. [题解] floyd算法. 先在原有的矩阵上. 做一遍floyd. 如 ...

  8. 仿oschina 主界面的实现(二) -------Toolbar + DrawerLayout

    watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQv/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/ ...

  9. Sass(SCSS)中文手册——入门

    简书原文 https://www.jianshu.com/p/e82c27aa05c7 前言 该中文手册是我在Sass中文文档的基础上编辑的,或者也可以理解为就是Sass中文文档的翻版.之所以有这篇文 ...

  10. OC学习篇之---文件的操作

    今天我们来介绍OC中文件操作,在之前的文章中,已经接触到了文件的创建了,但是那不是很具体和详细,这篇文章我们就来仔细看一下OC中是如何操作文件的: 第一.首先来看一下本身NSString类给我们提供了 ...