最小边覆盖(最小路径覆盖)(路径不可相交)——pku2060

2021年09月15日 阅读数:1
这篇文章主要向大家介绍最小边覆盖(最小路径覆盖)(路径不可相交)——pku2060,主要内容包括基础应用、实用技巧、原理机制等方面,希望对大家有所帮助。

 路径覆盖就是在图中找一些路经,使之覆盖了图中的全部顶点,且任何一个顶点有且只有一条路径与之关联node

最小路径覆盖就是找出最小的路径条数,使之成为P的一个路径覆盖.ide

最小路径覆盖=顶点数-最大匹配数(貌似与最大独立集同)测试

建图:集合A,B分别放顶点P,P'spa

若是出租车在X点能够Y点,则map[x][y]=1;//由于是X->Y,而题意Y显然没法到X,因此单向图string

附上测试数据:it

1io

5class

00:00 0 0 1 1map

00:02 1 1 2 2im

00:06 2 2 3 3

00:03 1 1 4 4

00:12 4 4 5 5

输出

2

最小边覆盖(最小路径覆盖)(路径不可相交)——pku2060_#include 最小边覆盖(最小路径覆盖)(路径不可相交)——pku2060_最大独立集_02 View Code
#include<stdio.h>
#include
<math.h>
#include
<string.h>

struct data
{
int time;
int a,b,c,d;
}node[
509];

int g,m;

bool map[509][509];
int mark[509];
bool flag[509];

bool dfs(int x)
{
int i;
for(i=1;i<=m;i++)
{
if(map[x][i]==0||flag[i]) continue;
flag[i]
=1;
if(mark[i]==0||dfs(mark[i]))
{
mark[i]
=x;
return 1;
}
}
return 0;
}

int dis(data x,data y)
{
return abs(x.a-x.c)+abs(x.b-x.d)+abs(y.a-x.c)+abs(y.b-x.d);
}

int main()
{
int t;
scanf(
"%d",&t);
while(t--)
{
memset(mark,
0,sizeof(mark));
memset(map,
0,sizeof(map));
int n;
scanf(
"%d",&n);
g
=m=n;
int a,b;

int i;
for(i=1;i<=n;i++)
{
scanf(
"%d:%d",&a,&b);
int time=a*60+b;

node[i].time
=time;
scanf(
"%d%d%d%d",&node[i].a,&node[i].b,&node[i].c,&node[i].d);
}

int j;
for(i=1;i<=n;i++)
{
for(j=i+1;j<=n;j++)
{
if(dis(node[i],node[j])<=node[j].time-node[i].time-1)
{
map[i][j]
=1;
}
}
}

int count=0;
for(i=1;i<=g;i++)
{
memset(flag,
0,sizeof(flag));
if(dfs(i)) count++;
}

printf(
"%d\n",n-count);
}
}