题目
思路
由于邻接矩阵内存爆炸,邻接表不方便标记边,于是想到利用邻接多重表,注意在邻接多重表中使用标记数组,而不是标记,这样每次查询就可以使用不同的标记数组。
代码
#include <iostream>
#include <vector>
using namespace std;
const int nmax = 110;
typedef struct node {
bool mark[nmax];
int ivex, jvex;
node* ilink, *jlink;
}*edge;
vector<edge> graph;
void Insert(edge& newnode,int tmp) {
if (graph[tmp] == nullptr)
graph[tmp] = newnode;
else {
node* cur = graph[tmp];
while (true) {
if (tmp == cur->ivex) {
if (cur->ilink != nullptr) cur = cur->ilink;
else {
cur->ilink = newnode;
break;
}
}
else {
if (cur->jlink != nullptr) cur = cur->jlink;
else {
cur->jlink = newnode;
break;
}
}
}
}
}
int main()
{
int n, m;
cin >> n >> m;
graph.resize(n);
fill(graph.begin(), graph.end(), nullptr);
for (int i = 0; i < m; ++i) {
int u, v;
cin >> u >> v;
node* newnode = new node();
memset(newnode->mark, 0, sizeof(newnode->mark));
newnode->ivex = u;
newnode->jvex = v;
newnode->ilink = newnode->jlink = nullptr;
Insert(newnode, u);
Insert(newnode, v);
}
int qn;
cin >> qn;
for (int i = 0; i < qn; ++i) {
int num, sum = 0;
cin >> num;
for (int j = 0; j < num; ++j) {
int tmp;
cin >> tmp;
node* cur = graph[tmp];
while (cur != nullptr) {
if (!cur->mark[i]) {
cur->mark[i] = true;
sum++;
}
tmp == cur->ivex ? cur = cur->ilink : cur = cur->jlink;
}
}
if (sum == m)
cout << "Yes" << endl;
else
cout << "No" << endl;
}
return 0;
}