1134. Vertex Cover (25)
A vertex cover of a graph is a set of vertices such that each edge of the graph is incident to at least one vertex of the set. Now given a graph with several vertex sets, you are supposed to tell if each of them is a vertex cover or not.
Input Specification:
Each input file contains one test case. For each case, the first line gives two positive integers N and M (both no more than 104), being the total numbers of vertices and the edges, respectively. Then M lines follow, each describes an edge by giving the indices (from 0 to N-1) of the two ends of the edge.
After the graph, a positive integer K (<= 100) is given, which is the number of queries. Then K lines of queries follow, each in the format:
Nv v[1] v[2] ... v[Nv]
where Nv is the number of vertices in the set, and v[i]'s are the indices of the vertices.
Output Specification:
For each query, print in a line "Yes" if the set is a vertex cover, or "No" if not.
Sample Input: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 2Sample Output:
No Yes Yes No No
解题思路:
y条边以下标0~y-1的顺序依次输入,用二维数组(列长为2)将每条边的两个端点编号进行记录。
每次flag初始为1,vis数组元素全部指向0,。输入一组端点编号,将与编号相对的vis数组下标元素设为1。
接着,把y条边(0-y-1)依次遍历。若有一条边的两个端点编号均不属于输入的端点编号,则表明没有完全覆盖。此时,用flag=0做标记,跳出循环。
flag=1,输出Yes,否则,输出No。
我的代码:
#include<stdio.h>
#include<memory.h>
int main()
{
int x,y,z,i,n,m,a[10001][2],vis[10001];
scanf("%d%d",&x,&y);
for(i=0;i<y;i++) scanf("%d%d",&a[i][0],&a[i][1]);
scanf("%d",&z);
while(z--)
{
scanf("%d",&n);
memset(vis,0,sizeof(vis));
int flag=1;
while(n--)
{
scanf("%d",&m);
vis[m]=1;
}
for(i=0;i<y;i++)
{
if(vis[a[i][0]]==0 && vis[a[i][1]]==0)
{
flag=0;
break;
}
}
if(flag==0) puts("No");
else puts("Yes");
}
return 0;
}