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

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