题目链接: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;
}

最新文章

  1. 一起学微软Power BI系列-官方文档-入门指南(3)Power BI建模
  2. 【bzoj1078】[SCOI2008]斜堆
  3. ubuntu12.04 Daemon的简单实现
  4. Js内置对象的应用
  5. python之安装
  6. key-list类型内存数据引擎介绍及使用场景
  7. 百度api的使用
  8. 关于web.xml中的&lt;welcome-file-list&gt;
  9. opencv imwrite保存图片花屏的问题
  10. yield关键字
  11. 测试WCF遇到的一些问题
  12. C# 检测证书是否安装、 安装证书
  13. jquery下插入标签以及clone的应用
  14. CSS一个元素同时使用多个类选择器(class selector)
  15. jQuery delay() 方法
  16. 前端通信:ajax设计方案(四)--- 集成ajax上传技术 大文件/超大文件前端切割上传,后端进行重组
  17. C#中?和:?和??总结
  18. 20155315庄艺霖第三次作业之Linux初体验
  19. 利用Fiddler,解密wireshark抓的HTTPS包
  20. 【java】子类可以通过调用父类的public方法调用父类的private方法,为什么?

热门文章

  1. Designing a CSS based template
  2. System &amp; Runtime &amp;Math
  3. 微信 xml 转 Map
  4. Python学习笔记(0)
  5. Linux进程基础
  6. linux mysql5.5安装与配置(转帖,在网上收集,自用)
  7. hdu2296Ring(ac自动机+dp)
  8. 【转】Linux下patch打补丁命令
  9. MFC编程入门之十三(对话框:属性页对话框及相关类的介绍)
  10. json 后台传前台