這玩意嚴格意義上算是水法(因為可能會被卡)

題目中,如果按照一般的bfs來搜索,那麼有平方級邊,會tle

如果按照補邊的線性來搜索,那麼時間複雜度變為min(k*k,m)*n,視n,m同階,則時間複雜度為nsqrt(n)

接下來需要設計一個和補邊數相關的算法

維護3個隊列,q1,q2,q3。q1代表待擴展節點列表,q2代表已經擴展節點列表,q3代表不能擴展節點列表

每次從q1中取出一個u,然後放進q2,然後聯通塊數目+1

再當q2非空時,從中取出一個v,嘗試用v擴展所有q1中的節點。當其與q1中的當前節點沒有邊,則將其放入q3,否則放入q2

最後,將q3所有節點放入q1

用哈希判斷邊是否存在

有可能會被卡,但是出題人顯然沒有卡

代碼:

#include<bits/stdc++.h>
using namespace std;
#define jzm 1000007
#pragma GCC optimize("O3")
int n,m,q;
set<int>s[100010];
int main(){
	//freopen("connect.in","r",stdin);
	//freopen("connect.out","w",stdout);
	scanf("%d%d%d",&n,&m,&q);
	while(m--){
		int x,y;
		scanf("%d%d",&x,&y);
		s[x].insert(y);
		s[y].insert(x);
	}
	while(q--){
		int t,x,ct=0;
		scanf("%d",&t);
		queue<int>q1,q2,q3;
		for(int i=1;i<=t;i++){
			scanf("%d",&x);
			q1.push(x);
		}
		while(!q1.empty()){
			int x=q1.front();q1.pop();
			ct++;q2.push(x);
			while(!q2.empty()){
				int z=q2.front();q2.pop();
				while(!q1.empty()){
					int y=q1.front();q1.pop();
					if(s[z].count(y))q3.push(y);
					else q2.push(y);
				}
				while(!q3.empty()){
					int y=q3.front();q3.pop();
					q1.push(y);
				}
			}
		}
		printf("%d\n",ct);
	}
}

jzoj5875的更多相关文章

随机推荐

  1. vue-awesome-swiper插件

    http://www.cnblogs.com/songrimin/p/6905136.html 这个地址不错 在上一些我的demo代码 第一步安装 npm install vue-awesome-sw ...

  2. Java jdk 8 新特性

    list 统计(求和.最大.最小.平均) 第一种方式 int suma = listUsers.stream().map(e -> e.getAge()).reduce(Integer::sum ...

  3. 原生JS获取地址了参数

    方法一:采用正则表达式获取地址栏参数:( 强烈推荐,既实用又方便!) function GetQueryString(name) {      var reg = new RegExp("( ...

  4. Linux系统 SecureCRT SecureFX 注册破解方法

    1.创建脚本文件crack-binary.sh,内容如下: #!/bin/sh        cd $1  cat SecureCRT  | od -A n -v -t x1 | tr -d ' \n ...

  5. 2018.10.19 NOIP训练 桌子(快速幂优化dp)

    传送门 勉强算一道dp好题. 显然第kkk列和第k+nk+nk+n列放的棋子数是相同的. 因此只需要统计出前nnn列的选法数. 对于前mmm%nnn列,一共有(m−1)/n+1(m-1)/n+1(m− ...

  6. 2018.08.16 洛谷P1437 [HNOI2004]敲砖块(二维dp)

    传送门 看起来普通dp" role="presentation" style="position: relative;">dpdp像是有后效性的 ...

  7. hdu-1026(bfs+优先队列)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1026 题意:输入n,m和一个n*m的矩阵, .表示通路: x表示墙: n表示有一个怪物,消灭它需要n个 ...

  8. C++之类和对象课后习题1

    建立一个对象数组,内放5个学生的(学号,成绩),设立一个函数max,用指向对象的指针作函数参数,在max函数中找出5个学生的最高成绩者,并输出其学号. #include<iostream> ...

  9. java拷贝文件到另一个目录下

    package com.util; import java.io.File;import java.io.FileInputStream;import java.io.FileOutputStream ...

  10. java Exception 出错的栈信息打印到日志中 打印堆栈信息

    我们在开发程序的过程当中,日志是必不可少的工具,这有助于我们分析问题的原因,和出错的详细信息,而java的异常机制又会方便且迅速的帮我们找到出错行的位置. try { .... } catch (Ex ...