hdu5876 Sparse Graph bfs + set

2024-04-09 15:48
文章标签 bfs graph set sparse hdu5876

本文主要是介绍hdu5876 Sparse Graph bfs + set,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

//  hdu5876 Sparse Graph bfs + set
//
//  题目链接:
//      http://acm.split.hdu.edu.cn/showproblem.php?pid=5876
//
//  题目大意:
//      给定图G,求反图中固定起点s到其余各点到最短路
//
//  解题思路:
//      维护一个集合acc,在当前集合中表示可以拓展到点。
//      维护一个集合ncc,在当前集合中表示不可以拓展到点。
//      bfs搜索,从当前队列中取出一点u,将图G中与u相连的
//      边从acc中删去,并添加到ncc中,并拓展acc中到点,并
//      添加到队列中,如此反复,直到队列为空。
//
//  解题感悟:
//      当时感觉这道题有点神奇,看了XJ的题解之后,发现都是
//      套路。一定要总结套路!加油 ^_^
#include <cstdio>
#include <iostream>
#include <cstring>
#include <stack>
#include <set>
#include <queue>
#include <algorithm>
using namespace std;
typedef long long ll;const int MAXN = 2e5 + 8;
vector<int> g[MAXN];
int n;
int dist[MAXN];
void solve(int s){set<int> acc,nacc;memset(dist,0,sizeof(dist));queue<int> que;que.push(s);for (int i = 1;i <= n;i ++){if (i != s)acc.insert(i);}while(!que.empty()){int u = que.front();que.pop();for (int i = 0;i < g[u].size();i ++){int& v = g[u][i];if (!acc.count(v))continue;acc.erase(v);nacc.insert(v);}for (set<int>::iterator it = acc.begin();it != acc.end();it ++){dist[*it] = dist[u] + 1;que.push(*it);}acc.swap(nacc);nacc.clear();}int flag = 0;for (int i = 1;i <= n;i ++){if (i != s){if (flag)printf(" ");if (!dist[i])printf("-1");elseprintf("%d",dist[i]);flag = 1;}}puts("");}int main(){int t;scanf("%d",&t);while(t--){int m;scanf("%d%d",&n,&m);for (int i = 1;i <= n;i ++)g[i].clear();for (int i = 1;i <= m;i ++){int u,v;scanf("%d%d",&u,&v);g[u].push_back(v);g[v].push_back(u);}int s;scanf("%d",&s);solve(s);}return 0;
}

这篇关于hdu5876 Sparse Graph bfs + set的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/888566

相关文章

hdu1254(嵌套bfs,两次bfs)

/*第一次做这种题感觉很有压力,思路还是有点混乱,总是wa,改了好多次才ac的思路:把箱子的移动当做第一层bfs,队列节点要用到当前箱子坐标(x,y),走的次数step,当前人的weizhi(man_x,man_y),要判断人能否将箱子推到某点时要嵌套第二层bfs(人的移动);代码如下:

poj 3050 dfs + set的妙用

题意: 给一个5x5的矩阵,求由多少个由连续6个元素组成的不一样的字符的个数。 解析: dfs + set去重搞定。 代码: #include <iostream>#include <cstdio>#include <set>#include <cstdlib>#include <algorithm>#include <cstring>#include <cm

poj 2195 bfs+有流量限制的最小费用流

题意: 给一张n * m(100 * 100)的图,图中” . " 代表空地, “ M ” 代表人, “ H ” 代表家。 现在,要你安排每个人从他所在的地方移动到家里,每移动一格的消耗是1,求最小的消耗。 人可以移动到家的那一格但是不进去。 解析: 先用bfs搞出每个M与每个H的距离。 然后就是网络流的建图过程了,先抽象出源点s和汇点t。 令源点与每个人相连,容量为1,费用为

POJ 3057 最大二分匹配+bfs + 二分

SampleInput35 5XXDXXX...XD...XX...DXXXXX5 12XXXXXXXXXXXXX..........DX.XXXXXXXXXXX..........XXXXXXXXXXXXX5 5XDXXXX.X.DXX.XXD.X.XXXXDXSampleOutput321impossible

Collection List Set Map的区别和联系

Collection List Set Map的区别和联系 这些都代表了Java中的集合,这里主要从其元素是否有序,是否可重复来进行区别记忆,以便恰当地使用,当然还存在同步方面的差异,见上一篇相关文章。 有序否 允许元素重复否 Collection 否 是 List 是 是 Set AbstractSet 否

论文翻译:ICLR-2024 PROVING TEST SET CONTAMINATION IN BLACK BOX LANGUAGE MODELS

PROVING TEST SET CONTAMINATION IN BLACK BOX LANGUAGE MODELS https://openreview.net/forum?id=KS8mIvetg2 验证测试集污染在黑盒语言模型中 文章目录 验证测试集污染在黑盒语言模型中摘要1 引言 摘要 大型语言模型是在大量互联网数据上训练的,这引发了人们的担忧和猜测,即它们可能已

深度优先(DFS)和广度优先(BFS)——算法

深度优先 深度优先搜索算法(英语:Depth-First-Search,DFS)是一种用于遍历或搜索树或图的算法。 沿着树的深度遍历树的节点,尽可能深的搜索树的分支,当节点v的所在边都己被探寻过,搜索将回溯到发现节点v的那条边的起始节点。这一过程一直进行到已发现从源节点可达的所有节点为止。如果还存在未被发现的节点,则选择其中一个作为源节点并重复以上过程,整个进程反复进行直到所有节点都被访

多路转接之select(fd_set介绍,参数详细介绍),实现非阻塞式网络通信

目录 多路转接之select 引入 介绍 fd_set 函数原型 nfds readfds / writefds / exceptfds readfds  总结  fd_set操作接口  timeout timevalue 结构体 传入值 返回值 代码 注意点 -- 调用函数 select的参数填充  获取新连接 注意点 -- 通信时的调用函数 添加新fd到

Android set Tag, findViewWithTag使用

设置了tag为“principal”的view ImageView principal = (ImageView) findViewById(R.id.imagen_home_0);principal.setTag("principal"); 在其它地方获取,获取已经设置了tag为“principal”的view LayoutInflater inflater = LayoutInflate

C++ STL关联容器Set与集合论入门

1. 简介 Set(集合)属于关联式容器,也是STL中最实用的容器,关联式容器依据特定的排序准则,自动为其元素排序。Set集合的底层使用一颗红黑树,其属于一种非线性的数据结构,每一次插入数据都会自动进行排序,注意,不是需要排序时再排序,而是每一次插入数据的时候其都会自动进行排序。因此,Set中的元素总是顺序的。 Set的性质有:数据自动进行排序且数据唯一,是一种集合元素,允许进行数学上的集合相