HDU 5876 (大连网赛1009)(BFS + set)
2024-08-22 02:20:51
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=5876
题意:给定一个图(n个顶点m条边),求其补图最短路
思路:集合a表示当前还未寻找到的点,集合b表示本次bfs之后仍未寻找到的点
#include<cstdio>
#include<set>
#include<queue>
#include<cstring>
using namespace std;
const int N = 2e5 + 5;
set <int> G[N],a,b;
int ans[N];
void bfs(int s)
{
queue <int> q;
set<int>::iterator it;
q.push(s);
while(!q.empty())
{
int t = q.front();
q.pop();
for(it = G[t].begin() ;it != G[t].end() ;it++)
{
if(a.count(*it))//如果当前还未寻找到
{
a.erase(*it);//该点本次可以寻找到,从a中删去
b.insert(*it);//本次仍不能找到
}
}
for(it = a.begin() ;it != a.end() ;it++)
{
ans[*it] = ans[t] + 1;
q.push(*it);
}
a.swap(b);//b传递给a
b.clear();//...
}
for(it = a.begin() ;it != a.end() ;it++)
ans[*it] = -1;//剩余的点
}
int main()
{
int T;
scanf("%d",&T);
while(T--)
{
int n,m,num = 0;
scanf("%d %d",&n,&m);
memset(ans,0,sizeof(ans));
a.clear();
for(int i = 1 ;i <= n ;i++)
G[i].clear();
while(m--)
{
int u,v;
scanf("%d %d",&u,&v);
G[u].insert(v);
G[v].insert(u);
}
int s;
scanf("%d",&s);
for(int i = 1 ;i <= n ;i++)
if(i != s) a.insert(i);
bfs(s);
for(int i = 1 ;i <= n ;i++)
{
if(i != s)
{
num++;
if(num != n-1)
printf("%d ",ans[i]);
else
printf("%d\n",ans[i]);
}
}
}
return 0;
}
最新文章
- 一起学微软Power BI系列-官方文档-入门指南(3)Power BI建模
- 【bzoj1078】[SCOI2008]斜堆
- ubuntu12.04 Daemon的简单实现
- Js内置对象的应用
- python之安装
- key-list类型内存数据引擎介绍及使用场景
- 百度api的使用
- 关于web.xml中的<;welcome-file-list>;
- opencv imwrite保存图片花屏的问题
- yield关键字
- 测试WCF遇到的一些问题
- C# 检测证书是否安装、 安装证书
- jquery下插入标签以及clone的应用
- CSS一个元素同时使用多个类选择器(class selector)
- jQuery delay() 方法
- 前端通信:ajax设计方案(四)--- 集成ajax上传技术 大文件/超大文件前端切割上传,后端进行重组
- C#中?和:?和??总结
- 20155315庄艺霖第三次作业之Linux初体验
- 利用Fiddler,解密wireshark抓的HTTPS包
- 【java】子类可以通过调用父类的public方法调用父类的private方法,为什么?