cf536d——优先队列的运用
题目
题目:Lunar New Year and a Wander
题目大意:给定一个n个顶点(编号1~n)、m条边的图,求从顶点1出发的字典序最小的路径(途径的边可重复)。
思路
使用一个优先队列就足够了。当访问一个节点,我们将与之相连的、未被访问的节点加入队列,每次取优先队列的队首进行访问。即优先队列中存放的是当前所有可到达且未被访问的节点(因为路径可重复)。
时间复杂度:$\mathcal{O}(m \log n)$
代码
priority_queue版
#include<cstdio>
#include<queue>
#include<vector>
using namespace std; typedef long long LL;
const int maxn = + ;
vector<int>e[maxn];
vector<int>seq;
bool vis[maxn];
int n, m;
priority_queue<int, vector<int>, greater<int>>Q; int main()
{
scanf("%d%d", &n, &m);
for (int i = ; i < m; i++)
{
int u, v;
scanf("%d%d", &u, &v);
e[u].push_back(v);
e[v].push_back(u);
}
vis[] = true;
Q.push();
while (!Q.empty())
{
int now = Q.top(); Q.pop();
seq.push_back(now);
for (int i = ; i < e[now].size(); i++)
{
if (!vis[e[now][i]])
{
Q.push(e[now][i]);
vis[e[now][i]] = true;
}
}
}
for (int i = ; i < seq.size(); i++)
printf("%d%c", seq[i], i == seq.size() - ? '\n' : ' ');
return ;
}
set版(set也能排序,且这里节点值不重复)
#include<cstdio>
#include<cstring>
#include<set>
#include<vector>
#include<algorithm>
using namespace std; typedef long long ll;
const int maxn = + ;
int n, m;
vector<int>vec[maxn];
bool visited[maxn]; int main()
{
scanf("%d%d", &n, &m);
for (int i = ;i < m; i++)
{
int u, v;
scanf("%d%d", &u, &v);
vec[u].push_back(v);
vec[v].push_back(u);
}
vector<int>ans;
set<int>st;
st.insert();
for (int i = ; i < n; i++)
{
int u, v;
u = *(st.begin());
ans.push_back(u);
visited[u] = true;
st.erase(u);
for (int j = ; j < vec[u].size(); j++)
{
v = vec[u][j];
if (!visited[v]) st.insert(v);
}
}
int len = ans.size();
for (int i = ; i < len; i++) printf("%d%c", ans[i], i == len - ? '\n' : ' '); return ;
}
参考链接:https://codeforces.com/blog/entry/64928
cf536d——优先队列的运用的更多相关文章
- 堆排序与优先队列——算法导论(7)
1. 预备知识 (1) 基本概念 如图,(二叉)堆是一个数组,它可以被看成一个近似的完全二叉树.树中的每一个结点对应数组中的一个元素.除了最底层外,该树是完全充满的,而且从左向右填充.堆的数组 ...
- 数据结构:优先队列 基于list实现(python版)
#!/usr/bin/env python # -*- coding:utf-8 -*- #Author: Minion-Xu #list实现优先队列 class ListPriQueueValueE ...
- python优先队列,队列和栈
打印列表的疑问 class Node: def __str__(self): return "haha" print([Node(),Node()]) print(Node()) ...
- 数据结构作业——Sanji(优先队列)
山治的婚约 Description 我们知道,山治原来是地下有名的杀人家族文斯莫克家族的三子,目前山治的弟弟已经出现,叫做四治,大哥二哥就叫汪(One)治跟突(Two)治好了(跟本剧情无关) .山治知 ...
- Java优先队列
按照Java api的说法: java.util.PriorityQueue.PriorityQueue() Creates a PriorityQueue with the default init ...
- 优先队列实现Huffman编码
首先把所有的字符加入到优先队列,然后每次弹出两个结点,用这两个结点作为左右孩子,构造一个子树,子树的跟结点的权值为左右孩子的权值的和,然后将子树插入到优先队列,重复这个步骤,直到优先队列中只有一个结点 ...
- “玲珑杯”ACM比赛 Round #7 B -- Capture(并查集+优先队列)
题意:初始时有个首都1,有n个操作 +V表示有一个新的城市连接到了V号城市 -V表示V号城市断开了连接,同时V的子城市也会断开连接 每次输出在每次操作后到首都1距离最远的城市编号,多个距离相同输出编号 ...
- Dijkstra算法优先队列实现与Bellman_Ford队列实现的理解
/* Dijkstra算法用优先队列来实现,实现了每一条边最多遍历一次. 要知道,我们从队列头部找到的都是到 已经"建好树"的最短距离以及该节点编号, 并由该节点去更新 树根 到其 ...
- 数据结构作业——ギリギリ eye(贪心+优先队列/贪心+并查集)
ギリギリ eye Description A.D.1999,由坠落地球的“谜之战舰”带来的 Over Technology,揭示了人类历史和远古文明之间的丝丝联系, 促使人类终止彼此间的战争,一方面面 ...
随机推荐
- vsftp 777权限
1. setsebool -P ftpd_disable_trans 1 2. service vsftpd restart
- YTU 2954: A改错题--是虫还是草
2954: A改错题--是虫还是草 时间限制: 1 Sec 内存限制: 128 MB 提交: 83 解决: 55 题目描述 冬虫夏草为虫体与菌座相连而成,冬天是虫子,夏天却是草.根据类生物(bio ...
- svn 添加用户名密码
1. 找到svn安装路径 我的是 /opt/svn/repositories/ (如果不知道,可以搜索 :find / -name authz) 2.进入该目录的conf,其中包含authz.pas ...
- Expression Blend实例中文教程(11) - 视觉管理器快速入门Visual State Manager(VSM)
Expression Blend实例中文教程(11) - 视觉管理器快速入门Visual State Manager(V 时间:2010-04-12 16:06来源:SilverlightChina. ...
- [Usaco2009 Dec] 过路费
[题目链接] https://www.luogu.org/problemnew/show/P2966 [算法] SPFA最短路 时间复杂度 : O(N ^ 2) [代码] #include<bi ...
- AutoIT: 学习对GUI Sample上所有的资源进行操作
$handle= WinGetHandle("Sample GUI") ;,"SRE Example 3 Result", $handle) $ctrl= Co ...
- 杂项-Java:JBoss
ylbtech-杂项-Java:JBoss 是一个基于J2EE的开放源代码的应用服务器. JBoss代码遵循LGPL许可,可以在任何商业应用中免费使用.JBoss是一个管理EJB的容器和服务器,支持E ...
- UI:数据的解析
在懒加载的时候要注意事项: 必须使用 self.XX 的样式去开辟空间,不能使用 _XX 的格式去开辟,因为前者是内部的 set 方法,而后者并不走内部的 set 方法. json 文件的创建 xm ...
- jquery中跳出each循环
or循环 VS jquery.each continue return true break return false
- Winpcap笔记4之不用回调函数捕获数据包
函数1: pcap_next_ex(pcap_t* p, struct pcap_pkthdr** pkt_header, const u_char* ...