PIPIOJ 1325 社交网络 (STL/bfs)(留意queue)

#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

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章