• Treasure Exploration POJ


    因为是路  所以 如果 1——3  2——3    3——4   3——5 则 1——4  1——5  2——4   2——5 都是是合法的 又因为机器人是可以相遇的  所以 我们把所有的点 分别放在左边和右边 去匹配  就能实现 路的连通性

    连通的路一个机器人就能遍历所有的点    没有路的点需要一个一个的机器人去找。。。

    注意是 n - 最大匹配  不是2n

    #include<stdio.h>
    #include<string.h>
    #include<queue>
    #include<algorithm>
    using namespace std;
    #define N 510
    int vis[N], used[N], maps[N][N], n, ans;
    
    void floyd()
    {
        for(int k=1; k<=n; k++)
            for(int i=1; i<=n; i++)
                for(int j=1; j<=n; j++)
                    if(maps[i][k] && maps[k][j])
                        maps[i][j] = 1;
    }
    
    bool Find(int u)
    {
        for(int i=1; i<=n; i++)
        {
            if(!vis[i] && maps[u][i])
            {
                vis[i] = 1;
                if(!used[i] || Find(used[i]))
                {
                    used[i] = u;
                    return true;
                }
            }
        }
        return false;
    }
    int main()
    {
        int a, b, m;
        while(scanf("%d%d", &n, &m), m+n)
        {
            memset(maps, 0, sizeof(maps));
            for(int i=0; i<m; i++)
            {
                scanf("%d%d", &a, &b);
                maps[a][b]  = 1;
            }
            floyd();
            ans = 0;
            memset(used, 0, sizeof(used));
            for(int i=1; i<=n; i++)
            {
                memset(vis, 0, sizeof(vis));
                if(Find(i))
                    ans++;
            }
            printf("%d
    ", n - ans);
        }
        return 0;
    }
    View Code

    过了很久之后再看这个题 竟然想不出来Floyd和相遇有啥关联

    又想了一想

    就拿2 - 5 为例  

    设图中匹配 为1 - 3   3  -  4

    在没有Floyd前 2 和 5 分别要一个机器人

    Floyd后 2 - 5 匹配 只需要一个就好了

    那和相遇又有啥关系呢

    在原图中2  - 5不是直达的边

    2必须经过3才能到5

    所以如果Floyd 那么从2到5 就必须经过3

    而3已经有机器人通过了 所以就会相遇 (这里不考虑通过的时间点)

    那为什么n - 最大匹配就是答案呢

    自己画图慢慢想

    我写给自己看的

    自己选择的路,跪着也要走完。朋友们,虽然这个世界日益浮躁起来,只要能够为了当时纯粹的梦想和感动坚持努力下去,不管其它人怎么样,我们也能够保持自己的本色走下去。
  • 相关阅读:
    YTU 2959: 代码填充--雨昕学矩阵
    YTU 2958: 代码填充--雨昕学画画
    YTU 2960: 改错题--小鼠标,你要干什吗?
    YTU 2975: 我的编号
    YTU 2979: MathBook类--多态
    linux命令学习:echo详解,格式化输出,不换行输出
    linux shell date 时间运算以及时间差计算方法
    C语言中mktime函数功能及用法
    Posix线程编程指南(3)
    Posix线程编程指南(2)
  • 原文地址:https://www.cnblogs.com/WTSRUVF/p/9314242.html
Copyright © 2020-2023  润新知