PAT_A1134
PAT甲级1134.
目录
A1134
题目
样例
输入:
10 11
8 7
6 8
4 5
8 4
8 1
1 2
1 4
9 8
9 1
1 0
2 4
5
4 0 3 8 4
6 6 1 7 5 4 9
3 1 8 4
2 2 8
7 9 8 7 6 5 4 2
输出:
No
Yes
Yes
No
No
思路和坑点
思路:
vertex cover的概念:图结点的某一个集合,图中每一条边至少涉及集合中一个点。
所以,将点集中点涉及到的所有边都进行标记,然后如果图的边未被全部标记,则不是vertex cover,否则是。
AC代码
#include<bits/stdc++.h>
#define MAXN 10004
using namespace std;
vector<int> v[MAXN]; //二维数组,每一个一维数组存放每一个顶点链接的边的编号
int n,m; //顶点数n和边数m
bool vis[MAXN]={false}; //边的访问标记
void Judge();
int main(){
#ifdef ONLINE_JUDGE
#else
freopen("1.txt", "r", stdin);
#endif
scanf("%d%d",&n,&m);
for(int i=0;i<m;i++){ //读入数据
int a,b;
scanf("%d%d",&a,&b);
v[a].push_back(i);
v[b].push_back(i);
}
int k;
scanf("%d",&k);
for(int i=0;i<k;i++) //依次判断每一组数据
Judge();
return 0;
}
void Judge()
{
int num,temp;
fill(vis,vis+m,false); //初始化vis数组
bool flag=true;
scanf("%d",&num);
for(int i=0;i<num;i++){ //依次读入num个顶点
scanf("%d",&temp);
for(int j=0;j<v[temp].size();j++){
vis[v[temp][j]]=true; //将每一个点所联系的边进行标记
}
}
for(int i=0;i<m;i++){ //遍历标记数组
if(vis[i]==false){
flag=false; break; //如果某条边未被访问过,则不构成vertex vocer
}
}
puts(flag?"Yes":"No"); //输出判定结果
}