1134 Vertex Cover(结点,所属边1,所属边2,。。。)
题目:https://pintia.cn/problem-sets/994805342720868352/problems/994805346428633088

方法一:
邻接表存储图,邻接矩阵标记边是否被访问,凉凉~~
1 #include<iostream> 2 #include<vector> 3 using namespace std; 4 5 const int maxn = 10000; 6 int G[maxn][maxn]; 7 int main() { 8 int n,m,u,v,k; 9 scanf("%d%d",&n,&m); 10 vector<int> adj[n]; 11 for(int i = 0; i < m; ++i) { 12 scanf("%d%d",&u,&v); 13 adj[u].push_back(v); 14 adj[v].push_back(u); 15 } 16 scanf("%d",&k); 17 while(k--) { 18 int num,cnt = 0; 19 for(int i = 0; i < n; ++i) 20 for(int j = 0; j < n; ++j) 21 G[i][j] = 0; 22 scanf("%d",&num); 23 for(int i = 0; i < num; ++i) { 24 scanf("%d",&u); 25 for(int j = 0; j < adj[u].size(); ++j) { 26 v = adj[u][j]; 27 if(G[u][v] == 0) { 28 G[u][v] = G[v][u] = 1; 29 cnt++; 30 } 31 } 32 } 33 if(cnt == m) printf("Yes\n"); 34 else printf("No\n"); 35 } 36 return 0; 37 }

方法二:

1 #include<iostream> 2 #include<vector> 3 using namespace std; 4 5 int main() { 6 int n,m,u,v,k; 7 cin>>n>>m; 8 vector<int> index[n];//记录结点所在边的编号 9 for(int i = 0; i < m; ++i) { //每一条边的编号 10 scanf("%d%d",&u,&v); 11 index[u].push_back(i); 12 index[v].push_back(i); 13 } 14 cin>>k; 15 while(k--) { 16 int num = 0,cnt = 0; 17 vector<int> hash(m,0);//标记边是否被访问 18 cin>>num; 19 for(int i = 0; i < num; ++i) { 20 cin>>u; 21 for(int j = 0; j < index[u].size(); ++j) 22 if(hash[index[u][j]] == 0) { 23 hash[index[u][j]] = 1; 24 cnt++; 25 } 26 } 27 if(cnt == m) printf("Yes\n"); 28 else printf("No\n"); 29 } 30 return 0; 31 }

 
                    
                     
                    
                 
                    
                
 
                
            
         
         浙公网安备 33010602011771号
浙公网安备 33010602011771号