#include<bits/stdc++.h>
using namespace std;
const int N = 1e3 + 7;
vector<int >vec[N];//邻接表思想,同二维数组,可用嵌套模板声明vector<vector<int>>a(未尝试)
int s[N];
bool viss[N], vis[N];
int ans[N];
int k, t;
bool bfs(int u) {
int cnt = 0;
vis[u] = 1;
cnt++;
queue<pair<int, int > >que;
que.push({ u,0 });
while (!que.empty()) {
pair<int, int> now = que.front();
que.pop();
if (now.second >= t)continue;
for (int i = 0; i < vec[now.first].size(); i++) {
if (viss[vec[now.first][i]] != 1) {
return false;
}
if(!vis[vec[now.first][i]]) {
vis[vec[now.first][i]] = 1;
cnt++;
que.push({ vec[now.first][i],now.second + 1 });
}
}
}
if (cnt == k)return true;//是否在t时间内感染集合中的所有主机
return false;
}
int main(){
int m, n;
scanf_s("%d %d", &n, &m);
while (m--) {
int u, v;
scanf_s("%d %d", &u, &v);
vec[u].push_back(v);
vec[v].push_back(u);
}
scanf_s("%d %d",&k, &t);
for (int i = 0; i < k; i++) {
scanf_s("%d", &s[i]);
viss[s[i]] = 1;
}
int cnt = 0;
for (int i = 0; i < k; i++) {
memset(vis, 0, sizeof(vis));//没有此行程序错误,搞不懂
bool flag = bfs(s[i]);
if(flag)ans[cnt++] = s[i];
}
if (cnt == 0) {
printf("-1\n");
return 0;
}
sort(ans, ans + cnt);
for (int i = 0; i < cnt; i++)printf("%d ", ans[i]);
printf("\n");
return 0;
}
一.序列容器
- list(链表)
- vector
- stack
- queue
- deque(double-end-queue双端队列)
- priority_queue
数组和双端队列可以随机存取。
二.vector:可变长度数组
- 是可存放任意数据类型的动态数组,同普通数组一样,可通过下标直接访问。
- 与其他动态序列容器相比,在末尾添加或删除元素相对高效。
三.vector常规操作
- 在末尾插入元素,push_back()
- 删除末尾元素,pop_back()
- 判断是否为空,empty()
- 清空,clear()
四.vector遍历操作
- front()访问第一个元素的值,而非地址,begin()(iterator操作)相反
- back()访问最后一个元素的值,而非地址,end()(iterator操作)相反
- 数组元素个数,size()
//以下标访问
vector<int >a;
for(int i=0;i<a.size();i++){
printf("%d ",a[i]);
}
//以迭代器访问
vector<int >::iterator it;
for(it=a.begin();it!=a.end();it++){
cout<<*it<<" ";
}
2020/1/21 -> 2020/2/13