poj2594 经处理后的最小路径覆盖

限时加码!20+主流AI编程工具免费用 购周边加赠Coding Plan Lite,Claude Code、Cursor等即刻畅享,学习进阶更高效! 阅读详情

题目描述:
给你一个有向无环图,有n个点,m条有向边。
一个机器人可以从任意点开始沿着边的方向走下去。对于每一个机器人:走过的点不能再走过。

问你最少用几个机器人可以走完所有的n个点,不同的机器人可以走相同的点。

可以看出这题类似于经典的最小路径覆盖。(注意最小路径覆盖和最小边覆盖的区别)只不过多了一个条件就是可以多个机器人访问同一个点。

思路也和之前一样,建图找最大匹配数,这时问题来了,怎么使一个点可以多次使用。

方法很简单,把所有可到达点都直接相连,也就是说,此时从1->2->3被直接改为了1->3,1->2,2->3.那就可以直接做了(我选择用flyod,不排除其他方法可做)

#include<cstdio>
#include<vector>
#include<cstring>
#include<algorithm>
using namespace std;
int n,m,root,num;
int mp[505][505];
int girl[505];
bool vis[505];
int dfs(int x)
{
	for(int i=1;i<=n;i++)
	{
		if(!vis[i]&&mp[x][i])
		{
			vis[i]=1;
			if(girl[i]==-1||dfs(girl[i]))
			{
				girl[i]=x;
				return 1;
			}
		}
	}
	return 0;
}
int main()
{
	int tt=0,T,x,y;
    while(scanf("%d %d",&n,&m)!=EOF&&(n+m))
	{
		memset(mp,0,sizeof(mp));
		memset(girl,-1,sizeof(girl));
		for(int i=0;i<m;i++)
		{
			scanf("%d %d",&x,&y);
			mp[x][y]=1;
		}
		for(int k=1;k<=n;k++)
		{
			for(int i=1;i<=n;i++)
			{
				if(mp[i][k])
				{
					for(int j=1;j<=n;j++)
					{
						mp[i][j]=mp[i][j]||mp[k][j];
					}
				}
			}
		}
		int ans=0;
		for(int i=1;i<=n;i++)
		{
			memset(vis,0,sizeof(vis));
			ans+=dfs(i);
		}
		printf("%d\n",n-ans);
	}
    return 0;
}


有向无(DAG)的最小路径覆盖 http://www.cnblogs.com/justPassBy/p/5369930.html 阅读详情

相关推荐

C# Socket网络通信UDP(关键字:Socket)

简单Socket-Udp通信 在本文中涉及到通信,仅做简单的通信(服务端接受消息,由客户端发出消息) 如有需要,根据需求可直接copy使用 关键字Socket 需要引用命名空间: using System.Net; using System.Net.Sockets; 服务端: using System; using System.Net; using System.Net.Sockets; u...

MelanceXin的博客 3870

如何选择旅游路线,使得假期旅游路费最少?

TSP,全称为Traveling Salesman Problem,即旅行商问题。它是一个经典的组合优化问题,其目标是找到一条路径,使得旅行商能够访问一组城市,并且总路程最短。

MindOpt_003的博客 2398

电池充电管理芯片规格书精读指南:从参数解析到设计实战

电池充电管理是嵌入式系统和便携式设备开发中的基础节,其核心在于理解并应用充电芯片的规格参数。充电芯片通过精确控制电压、电流、温度等关键参数,实现对锂电池等可充电电池的安全、高效管理。掌握这些参数原理,对于优化产品功耗、提升充电效率、保障电池寿命具有重要技术价值,广泛应用于智能穿戴、消费电子、无人机等场景。本文聚焦于**充电电流**设定与**热管理**等核心参数,深入解析其相互影响与工程选型中的权衡,旨在帮助开发者将抽象的规格书数据转化为可靠的电路设计依据,从而有效排查充电故障,提升产品整体可靠性。

weixin_26874745的博客 636

Graph——解题报告

题目链接:http://132.232.5.128:666/problem/125 题目大意: 给定一张n个m条边的无向,每条边连接两个顶,保证无重边自,不保证连通。 你想在这张上进行若干次旅游,每次旅游可以任选一个x作为起,再走到一个与x直接有边相连的y,再走到一个与y直接有边相连的z并结束本次旅游 作为一个旅游爱好者,你不希望经过任意一条边超过一次,注意一条边不能即正向走一次......

风中的微尘的博客 385

poj2594最小可相交覆盖路径问题)

最小可相交覆盖: 先用floyd求出原的传递闭包,即如果a->b有路径,b->c有路径,,则加边a->c。然后就转化成了最小路径覆盖问题(最小不相交路径覆盖问题)。 最小路径覆盖数: 对于一个DAG(有向无),选取最少条路径,使得每个 顶属于且仅属于一条路径路径长度可以为零;(有向中找一些路径,使之覆盖中的所有顶,就是任意一个顶都跟那些路径中的某一条关联,且任何一个顶有且只有一个与之关联) 最小路径覆盖数(最少边覆盖)=顶数-最大匹配数; 思路:把每个都拆成两个

Keep_Trying_Go的博客 760

POJ - 2594 Treasure Exploration(最小可相交路径覆盖

链接:POJ - 2594 Treasure Exploration 题意: 给出一个含有n (1≤n≤500)n\,(1\le n\le 500)n(1≤n≤500)个结、m(0≤m≤5000)m(0\le m\le 5000)m(0≤m≤5000)条边的有向无(DAG),机器人可以从任意出发,问至少需要多少机器人,才能遍历上所有?(允许同一同时存在多个机器人) 分析: 即求D...

Plus Ultra! 318

POJ 2594 最小路径覆盖(重复)

POJ 2594 二分图性质: 最小路径()覆盖(路径不相交) = N - 最大匹配 题意: 在有向无.求最小路径()覆盖(路径相交的可重复) 思路 假设一条路径经过u->p->v,另一条x->p->y.路径相交于p,于是添加一条x->y或者u->v的边 能够使得2条路径不相交 进一步: 将有向中所有的间接.通过添加有向边(x,y)变为直接...

_llc的博客 413

POJ 2594 传递闭包的最小路径覆盖

Treasure Exploration Time Limit:6000MS Memory Limit:65536K Total Submissions:7171 Accepted:2930 Description Have you ever read any book about treasure explorat...

acy4225的博客 126

POJ 2594 Treasure Exploration(最小路径覆盖 传递闭包)

最小路径覆盖 == 顶数 - 配对数,此时每个顶只能经过一次,若是经过一个多次,例如下面博客所介绍的,当路径相交的时候,应该进行一次传递闭包处理,也就是跑一遍Floyd再进行最大匹配 讲解博客:http://www.cnblogs.com/ka200812/archive/2011/07/31/2122641.html 题目链接:https://vjudge.net/problem/PO...

STOP 259

POJ2594 Treasure Exploration【DAG有向可相交的最小路径覆盖

题目链接:http://poj.org/problem?id=2594 Treasure Exploration Time Limit:6000MS Memory Limit:65536K Total Submissions:10480 Accepted:4250 Description Have you ever ...

a6334167的博客 166

poj2594 机器人寻找宝藏(最小路径覆盖

题目来源:http://poj.org/problem?id=2594 参考博客:http://www.cnblogs.com/ka200812/archive/2011/07/31/2122641.html 题解: 最小路径覆盖=|P|-最大匹配数 单向且没有循,不可能存在a到b,b又到a,并且可以经过已经经过的,所以对整个进行处理,间接连接的可以看作是直接连接 ...

diandu7489的博客 169

最小路径覆盖(匈牙利算法)

最小路径算法解决以下问题:对于一个DAG,找到最少的路径覆盖所有顶。按路径可否相交分为两类。 首先是路径不相交的最小覆盖: 我们可以把每个顶分为出和入,这时每种路径安排都是一个二分图P',问题转化为了求该二分图的最大匹配:如果在P'中增加一条匹配边pi'-->pj',那么在P的路径覆盖中就存在一条由pi连接pj的边,也就是说pi与pj 在一条路径上,于是路径覆盖数就可以减少一...

rgndao的博客 1162

poj 2594(可相交的最小路径覆盖)

题目链接:http://poj.org/problem?id=2594 思路:本来求最小路径覆盖是不能相交的,那么对于那些本来就可达的怎么处理,我们可以求一次传递闭包,相当于是加边,这样我们就可以来求最小路径覆盖了。最小路径覆盖=顶数-最大匹配。http://www.cnblogs.com/ka200812/archive/2011/07/31/2122641.html http://pa

几百个教授的专栏 558

poj2594(可相交最小路径覆盖)

直接先传递闭包,等同于扩边,最后就是一般最小路径覆盖的做法了。const int maxn = 501; int g[maxn][maxn]; int linker[maxn]; bool vis[maxn]; int n, m; bool dfs(int u) { for (int v = 1;v <= n;++v) { if (g[u][v] && !vis[v]) {

KIJamesQi的博客 463

poj2594 Treasure Exploration【最小路径覆盖

题目链接:http://poj.org/problem?id=2594 题意:给你一个有n个,m条边的有向,你派若干个机器人去探路,问你最少派几个机器人能把全部路走,每个结可以重复走 解析:很明显的最小路径覆盖,由于可以重复走,所以要用floyd缩处理以后,ans = n-最大匹配#include <iostream> #include <cstring> #include <algo

22h's Blog 372

POJ 2594 Treasure Exploration(最小可相交路径覆盖)题解

题意:有n个,m条单向边,每个机器人能沿着单向边走,能重复经过一个,问最少几个机器人走遍n个 思路:原来以前学的都是不能相交的算法....可相交的做法是跑Floyd把能到达的都加上边,然后跑最小覆盖 代码: #include<set> #include<map> #include<stack> #include<cmath> ...

weixin_33748818的博客 160

poj-2594

// 2712K 266MS G++ #include #include #include using namespace std; #define MAX 520 int G[MAX][MAX]; int G_F[MAX][MAX]; int iNum; int sNum; int V1[MAX]; int V2[MAX]; char waitingMove[MAX];

fyfcauc的专栏 565

poj 2594 floyd+最小路径覆盖

传送门 题意:派机器人去火星寻宝,给出一个无的有向,机器人可以降落在任何一个上,再沿着路去其他探索,我们的任务是计算至少派多少机器人就可以访问到所有的。有的可以重复去。 思路:先floyd,把某能到的都给求出来,然后最小路径覆盖。 #include #include #include #define maxn 1<<28 using namespace std; bool d

Cugb->Baoge 606

poj2594Treasure Exploration

http://www.elijahqi.win/2017/12/15/poj2594treasure-exploration/ ‎ Description Have you ever read any book about treasure exploration? Have you ever see any film about treasure exploration? Have you

Elijahqi 234
上一篇: 算法讲解:二分图匹配
下一篇: poj1987 Distance Statistics 树的分治
thunderMrbird
博客等级 码龄10年 41粉丝 37原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值