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

    Description

    定义: 一个不含圈的有向图G中,G的一个路径覆盖是一个其结点不相交的路径集合P,图中的每一个结点仅包含于P中的某一条路径。路径可以从任意结点开始和结束,且长度也为任意值,包括0。请你求任意一个不含圈的有向图G的最小路径覆盖数。
      
    Input

    t 表示有t组数据;n 表示n个顶点(n<=120);m 表示有m条边;
       接下来m行,每行有两个数 i,j表示一条有向边。

    Output

    最小路径覆盖数

    Sample Input

    2
    4
    3
    3 4
    1 3
    2 3
    3
    3
    1 3
    1 2
    2 3

    Sample Output

    2
    1
    .
    .
    .
    .
    .
    分析
    最小路径覆盖数=原图G的顶点数-二分图的最大匹配数
    .
    .
    .
    .
    .
    程序:

    #include<iostream>
    #include<cstdio>
    #include<cstring>
    using namespace std;
    int ans,tj,n,m,link[4000],v[4000],head[4000];
    
    struct node
    {
    	int to,next;
    }f[4000];
    
    int find(int x)
    {
    	for (int i=head[x];i;i=f[i].next)
    	{
    		int j=f[i].to;
    		if (!v[j])
    		{
    			int q=link[j];
    		    link[j]=x;
    		    v[j]=1;
    		    if (!q||find(q)) return 1;
    		    link[j]=q;
    		}
    		
    	}
    	return 0;
    }
    
    int main()
    {
    	int t;
    	scanf("%d",&t);
    	for (int u=1;u<=t;u++)
    	{
    		memset(f,0,sizeof(f));
    		memset(head,0,sizeof(head));
    		memset(link,0,sizeof(link));
    		scanf("%d",&n);
    		scanf("%d",&m);
    		tj=0;
    		for (int i=1;i<=m;i++)
    		{
    			int x,y;
    			scanf("%d%d",&x,&y);
    		
    			f[++tj].next=head[x];
    			f[tj].to=y;
    			head[x]=tj;
    		}
    		ans=0;
    		for (int i=1;i<=n;i++)
    		{
    			memset(v,0,sizeof(v));
    			ans+=find(i);
    		}
    		cout<<n-ans<<endl;
    	}
    	return 0;
    }
    
    
  • 相关阅读:
    nginx 转发避免携带端口
    docker-compose 搭建php+nginx+mysql+redis
    20+个JavaScript单行代码
    IaaS,PaaS,SaaS 的区别
    C# String和StringBuilder的区别
    Vue基本语法
    Gitee仓库使用方法
    6个实例详解如何把if-else代码重构成高质量代码
    Redis常见问题
    winform程序打包成exe文件
  • 原文地址:https://www.cnblogs.com/YYC-0304/p/10292802.html
Copyright © 2011-2022 走看看