浙大JAVA实验题12_2019浙大计算机考研机试模拟赛(2)——概念专题

题目链接   引用自晴神OJ

A - 边覆盖

B - 极大独立集

C - 稳定婚姻问题

D - 笛卡尔树

没赶得上全程的比赛,就做了两道,后面两道以后有时间再补。两道都是概念题,比较基础~ 以下是题解

A - 边覆盖

Case Time Limit: 200 MS (Others) / 400 MS (Java)       Case Memory Limit: 256 MB (Others) / 512 MB (Java)

Accepted:

199      Total Submission:

362

Problem Description

对一个给定的无向图G(V,E),边集E'是E的子集。如果V中的所有顶点都在E'中出现过,那么称边集E'是图G的一个边覆盖(Edge Cover)。

(以上定义引自https://en.wikipedia.org/wiki/Edge_cover)

根据上面的定义,请判断一些给定的边集是否是给定的无向图的边覆盖。

Input

每个输入文件一组数据。

第一行为两个整数N、M(1<=N<=500, 1<=M<=N*(N-1)/2),分别表示无向图的顶点数和边数。假设图上的顶点编号为从1到N。

接下来M行,每行两个正整数u、v(1<=u,v<=N, u!=v),分别表示一条无向边的两个端点。数据保证没有重边。

接着一个正整数K(K<=10),表示查询的个数。

然后是K个查询,每个查询第一行为一个正整数L(L<=M),表示欲查询边集E'中的边数;接下来L行,每行两个整数,表示边集E'中的一条边。数据保证E'一定是E的子集。

Output

每个查询一行,如果欲查询边集E'不是图G的边覆盖,那么输出No;否则输出Yes。

Sample Input

6 7

1 2

1 3

2 3

2 4

3 5

4 5

4 6

3

3

1 2

3 5

4 6

4

1 2

2 3

4 5

4 6

3

1 2

2 3

4 6

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

Sample Output

Yes

Yes

No

Author

Shoutmon

Source

19浙大考研机试模拟赛

分析:题目是中文题,意思是输入一堆边,看这些边是否将所有顶点都覆盖到了。只需要在每次查询输入后,将边所连的顶点置为已访问,再遍历一次访问数组即可。

377cbb730c5b3e9cc40fc14b9e4ea2e5fc6.jpg

8f615ce7209f3a7ebbaf530dae154e07ac8.jpg

#include #include#include#include#include#include#include

using namespacestd;const int maxn=510;intG[maxn][maxn];boolvis[maxn];intmain()

{//freopen("1.txt","r",stdin);

intn,m;

cin>>n>>m;intu,v;for(int i=0;i

scanf("%d%d",&u,&v);

G[u][v]=1;

G[v][u]=1;

}intk;

cin>>k;while(k--){intL;

scanf("%d",&L);

memset(vis,0,sizeof(vis));for(int i=0;i

scanf("%d%d",&u,&v);

vis[u]=true;

vis[v]=true;

}intj;for(j=1;j<=n;j++){if(vis[j]==false){

printf("No\n");break;

}

}if(j==n+1) printf("Yes\n");

}return 0;

}

View Code

B - 极大独立集

Case Time Limit: 100 MS (Others) / 200 MS (Java)       Case Memory Limit: 256 MB (Others) / 512 MB (Java)

Accepted:

140      Total Submission:

303

Problem Description

对一个给定的无向图G(V,E),点集V'是V的子集。如果V'中的任意两个顶点之间都没有边,就称点集V'是图G的独立集(Independent Set)。在此基础上,如果往V'中添加任何一个在V中但不在V'中的顶点,都会使V'变成非独立集,那么就称V'是图G的极大独立集(Maximal Independent Set)。

(以上定义引自https://en.wikipedia.org/wiki/Independent_set_(graph_theory))

根据上面的定义,请判断一些给定的点集是否是给定的无向图的极大独立集。

Input

每个输入文件一组数据。

第一行为两个整数N、M(1<=N<=500, 1<=M<=N*(N-1)/2),分别表示无向图的顶点数和边数。假设图上的顶点编号为从1到N。

接下来M行,每行两个正整数u、v(1<=u,v<=N, u!=v),分别表示一条无向边的两个端点。数据保证没有重边。

接着一个正整数K(K<=10),表示查询的个数。

然后是K个查询,每个查询第一行为一个正整数L(L<=N),表示欲查询点集V'的顶点个数;第二行为用空格隔开的L个正整数,表示V'中的顶点编号。数据保证V'一定是V的子集。

Output

每个查询一行,如果欲查询的点集不是图G的独立集,那么输出Not an Independent Set;如果欲查询的点集是图G的独立集但不是极大独立集,那么输出Not Maximal;如果欲查询的点集是图G的极大独立集,输出Yes。

Sample Input

6 5

1 2

2 3

2 4

4 5

4 6

3

2

1 4

3

1 3 4

3

1 2 4

Sample Output

Not Maximal

Yes

Not an Independent Set

Author

Shoutmon

Source

19浙大考研机试模拟赛

分析:判断是否是极大独立集,根据定义一个独立集是指任意两个顶点之间都没有边的点集,所谓最大就是加入任意一个顶点都会“破坏”独立集。先判断是否是独立集,然后再枚举每一个未在点集中的点,判断是否在加入后会“破坏”独立集。注意到样例中已经给出了坑点,即1和4仅是独立集不是最大独立集,因为加入3后仍然是一个独立集,知道这点以后就可以轻松解决了。

70a47df8ef10d368ff2295bb1835a7e2655.jpg

9bd17bff0c2a540f4ad82afce76ae1ebb34.jpg

#include #include#include#include#include#include#include

using namespacestd;const int maxn=510;int G[maxn][maxn]={0};boolvis[maxn];intmain()

{//freopen("1.txt","r",stdin);

intn,m;

cin>>n>>m;intu,v;for(int i=0;i

scanf("%d%d",&u,&v);

G[u][v]=G[v][u]=1;

}intK;

scanf("%d",&K);

loop:while(K--){intL;

scanf("%d",&L);

vectorvec;inttemp;

memset(vis,0,sizeof(vis));for(int i=0;i

scanf("%d",&temp);

vec.push_back(temp);

vis[temp]=true;

}for(int i=0;i

cout<

}

}

}bool flag=false;for(int i=1;i<=n;i++){if(vis[i]==false){intj;for(j=0;j

}

}if(j==vec.size()){

cout<

flag=true;gotoloop;

}

}

}if(!flag) cout<

}return 0;

}

View Code

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值