zoukankan      html  css  js  c++  java
  • hdu 1151 最小路径覆盖

    先说说最小路径覆盖的定义

    定义:在一个有向图中,找出最少的路径,使得这些路径,经过每一个点,且每一个点只与一条路径相关联,

    由上面得出:

    1.一个单独的点是一个路径

    2:如果有路径a,b,c。。。。f,g。a为起点,g为终点。那么a到g的点不在与其他点之间存在有向边。

    最小路径覆盖=点数---最大匹配数

    证明:
    1  如果匹配数为0,那么图中没有边,需要n条路径

    2  如果a,b之间连一条边,那么匹配数增1,需要的路径数会减少一,因为a,b之间只需要一条,那么就证明了


    #include<cstdio>
    #include<iostream>
    #include<string>
    #include<cstring>
    #define maxn 1001
    using namespace std;
    int n,m,mapp[maxn][maxn],vis[maxn],g[maxn];
    void init()
    {
    fill(&mapp[0][0],&mapp[maxn][0],0);
    memset(g,0,sizeof(g));
    }
    int Find(int x)
    {
    for(int i=1;i<=n;i++)
    {
    if(mapp[x][i]&&!vis[i])
    {
    vis[i]=1;
    if(!g[i] || Find(g[i]))
    {
    g[i]=x;
    return 1;
    }
    }
    }
    return 0;
    }
    int max_march()
    {
    int ans=0;
    for(int i=1;i<=n;i++)
    {
    memset(vis,0,sizeof(vis));
    if(Find(i)) ans++;
    }
    return ans;
    }
    int main()
    {
    cin.sync_with_stdio(false);
    int t;
    cin>>t;
    while(t--)
    {
    cin>>n;//reshu
    cin>>m;
    init();
    while(m--)
    {
    int a,b;
    cin>>a>>b;
    mapp[a][b]=1;
    }
    cout<<n-max_march()<<endl;
    }
    return 0;
    }

  • 相关阅读:
    告别08
    WinForm程序如何将子窗体嵌入到父窗体的Panel里
    几种排序算法
    接口的特征
    什么是重写
    C#异常处理
    什么是重载
    结构和类的区别
    Javascript的函数
    在ASP.NET中防止注入攻击
  • 原文地址:https://www.cnblogs.com/z1141000271/p/5817131.html
Copyright © 2011-2022 走看看