zoukankan      html  css  js  c++  java
  • Treasure Exploration---poj2594(传递闭包Floyd+最小路径覆盖)

    题目链接:http://poj.org/problem?id=2594

    在外星上有n个点需要机器人去探险,有m条单向路径。问至少需要几个机器人才能遍历完所有的点,一个点可以被多个机器人经过(这就是和单纯的最小路径覆盖的区别)。

    因为图是一个有向图

    例如 1—>3,

       2—>3;

       3—>4;

       3—>5;

    左边是floyd之前的,右边是传递之后的,左边的最大匹配是2,右边是3;

    其中为什么用传递闭包就能求最大匹配,自己只可意会不可言传;—_—;

     

    #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

     

  • 相关阅读:
    分数加减法
    两点距离
    1的个数
    Swift 了解(1)
    ARC快速入门
    ARC基本概念
    autorelease注意事项
    autorelease基本使用
    NSTimer的使用
    如何监听控件的行为
  • 原文地址:https://www.cnblogs.com/zhengguiping--9876/p/4726653.html
Copyright © 2011-2022 走看看