pat-1149

这段代码示例展示了如何利用散列数据结构来检查图中节点的连通性。通过输入边来构造邻接矩阵,并用散列判断给定集合内的节点是否直接或间接相连。这种方法在处理大规模数据时效率较高,避免了冗余遍历。同时,注意了内存优化,将大型数据结构移出局部作用域,减少内存占用。
摘要由CSDN通过智能技术生成
#include<iostream>
#include<vector>
#include<algorithm>
using namespace std;
vector<int>v[100000];
int main(){
	int n,m,_1,_2,k,kt;
	cin>>n>>m;
	
	for(int i=0;i<n;i++){
		cin>>_1>>_2;
		v[_1].push_back(_2);
		v[_2].push_back(_1);
	}
	for(int i=0;i<m;i++){
		cin>>k;
		vector<int>vce;
		int flag=0;
		int hash[100000]={0};//判断有无 
		fill(hash,hash+100000,0);
		for(int j=0;j<k;j++){
			cin>>kt;
			vce.push_back(kt);
			hash[kt]=1;
		}
		for(int j=0;j<k;j++){
			for(int i=0;i<v[vce[j]].size();i++){
				if(hash[v[vce[j]][i]]==1) flag=1;
			}
		}
		if(flag==0){
			printf("Yes\n");
		} 
		else{
			printf("No\n");
		}
		
	}
	return 0;
} 

总结 1.能用hash散列判断有无的就用hash散列,比遍历从第一找到最后一个快太多了

2.当数据特别大时比如v[100000]要放在main函数外作为全局变量

3.输出格式即使是yes no也不要自己打,直接复制减少错误

英语

 

问题

注意一下map 与二维vector的应用 占的空间要少一些map<int,vector<int>>

 

 

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值