1134. Vertex Cover (25)[图的遍历]

本文介绍了一道 PAT-A 1134 的算法题解,题目要求判断图中所有边的至少一个端点是否属于给定的点集。通过使用 C++ 实现图的遍历,并利用 set 容器来存储和检查点集,最终实现了高效的算法解决方案。

1. 原题: https://www.patest.cn/contests/pat-a-practise/1134

2. 思路

题意:
给出一个图,点的集合,判断图中所有边的至少一个点是否都包含在集合中。
思路:
图的遍历问题。
遍历每条边,看边的两点是否至少一点在集合里,否则输出no。
用了容器set。

3. 源码(已AC)

#include <iostream>
#include <vector>
#include <cstring>
#include <set>
using namespace std;

vector< vector<int> > G;	//图的邻接表表示

int main()
{
	//freopen("in.txt", "r", stdin);
	int M, N;//边数,总点数
	scanf("%d %d", &N, &M);
	G.resize(N);

	int s, d;
	for (int i = 0; i < M; i++)
	{
		scanf("%d %d", &s, &d);
		G[s].push_back(d);//有向图表示即可
	}

	int q, p, t, sig;//查询数, 集合的点数,临时变量,标志
	scanf("%d", &q);
	for (int i = 0; i < q; i++)
	{
		scanf("%d", &p);
		set<int> st;
		for (int j = 0; j < p; j++)
		{
			scanf("%d", &t);
			st.insert(t);
		}

		sig = 0;
		for (int j = 0; j < N; j++)
		{
			for (int k = 0; k < G[j].size(); k++)
			{
				if (st.count(j) == 0 && st.count(G[j][k]) == 0)//不在集合,输出no
				{
					sig = 1;
					goto output;
				}
			}
		}

output:	if (sig == 1)
			printf("No\n");
		else
			printf("Yes\n");
	}

	return 0;
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值