https://vjudge.net/problem/CSU-2005

题意:
给出带权值的图,图上有一些特殊点,现在给出q个询问,对于每个询问,输出离该点最近的特殊点,如果有多个,则按升序输出。

思路:
因为有多次查询,不可能对于每个询问都去跑一遍最短路。必须以特殊点为起点跑一遍最短路,但是这样路径的记录就是问题了。正解是用bitset来记录状态,在最短路松弛更新状态时,继承前驱节点即可。

 #include<iostream>
#include<algorithm>
#include<cstdio>
#include<cstring>
#include<queue>
#include<bitset>
#include<set>
using namespace std;
const int INF = 0x3f3f3f3f;
const int maxn = +; int n,m,s,q,tot;
int head[maxn],d[maxn],a[];
bool done[maxn],flag[maxn];
bitset<> ans[maxn];
int tmp[]; struct node
{
int v,w,next;
}e[*maxn]; void addEdge(int u, int v, int w)
{
e[tot].v = v;
e[tot].w = w;
e[tot].next = head[u];
head[u] = tot++;
} struct HeapNode
{
int u,d;
HeapNode(int u, int d):u(u),d(d){}
bool operator< (const HeapNode& rhs) const
{
return d > rhs.d;
}
}; void dijkstra(int st)
{
priority_queue<HeapNode> Q;
for(int i=;i<=n;i++) d[i] = INF;
d[st] = ;
memset(done,,sizeof(done));
Q.push(HeapNode(st,));
while(!Q.empty())
{
HeapNode x = Q.top(); Q.pop();
int u = x.u;
if(done[u]) continue;
done[u] = true;
for(int i=head[u];i!=-;i=e[i].next)
{
int v = e[i].v;
if(d[v] > d[u]+e[i].w)
{
d[v] = d[u] + e[i].w;
if(!flag[v]) ans[v] = ans[u]; //如果不是特殊点,就更新
Q.push(HeapNode(v,d[v]));
}
else if(d[v] == d[u]+e[i].w) ans[v]|=ans[u]; //相等的话,就加上当前点的答案
}
}
} int main()
{
//freopen("in.txt","r",stdin);
while(~scanf("%d%d%d%d",&n,&m,&s,&q))
{
tot = ;
memset(head,-,sizeof(head));
memset(flag,,sizeof(flag));
for(int i=;i<=n;i++) ans[i].reset();
for(int i=;i<=m;i++)
{
int u,v,w;
scanf("%d%d%d",&u,&v,&w);
addEdge(u,v,w);
addEdge(v,u,w);
}
for(int i=;i<=s;i++)
{
scanf("%d",&a[i]);
addEdge(,a[i],);
flag[a[i]] = true;
ans[a[i]].set(i); //特殊点的答案就是自己
}
dijkstra();
while(q--)
{
int tot = ;
int x;scanf("%d",&x);
for(int i=;i<=s;i++)
if(ans[x].test(i)) tmp[tot++]=a[i];
sort(tmp,tmp+tot);
for(int i=;i<tot;i++)
printf("%d%c",tmp[i],i==tot-?'\n':' ');
}
}
return ;
}

CSU 2005 Nearest Maintenance Point(最短路+bitset)的更多相关文章

  1. CSU 2005: Nearest Maintenance Point(Dijkstra + bitset)

    Description A county consists of n cities (labeled 1, 2, …, n) connected by some bidirectional roads ...

  2. BZOJ 5097: [Lydsy1711月赛]实时导航(最短路 + bitset)

    题意 \(n​\) 个点的有向图,边权 \(\in \{1, 2, 3, 4\}​\) ,\(m​\) 次修改边权/加边/删边,\(q​\) 次询问:以 \(s_i​\) 为起点,输出它到其他点的最短 ...

  3. CSU——2161: 漫漫上学路 最短路

    Description 众所周知,CSU(California State)University) 的上课地点距离学生公寓很远,对于爱睡懒觉的小Z来说,每天去上课就成了一件非常头疼的事,如果有早课的话 ...

  4. LOJ6252. 「CodePlus 2017 11 月赛」大吉大利,晚上吃鸡! 最短路+bitset

    题目传送门 https://loj.ac/problem/6252 https://lydsy.com/JudgeOnline/problem.php?id=5109 题解 首先跑最短路,只保留 \( ...

  5. HAOI 2005 路由选择问题 (最短路+次短路)

    问题描述 X城有一个含有N个节点的通信网络,在通信中,我们往往关心信息从一个节点I传输到节点J的最短路径.遗憾的是,由于种种原因,线路中总有一些节点会出故障,因此在传输中要避开故障节点. 任务一:在己 ...

  6. CSU 1060 Nearest Sequence

    题意:求三个序列的最长公共子序列. 思路:一开始以为只要求出前两个的LCS,然后和第三个再求一遍LCS就是答案了.但是样例就对我进行啪啪啪打脸了.实际上就跟两个序列的差不多,换成三维的就行了. 代码: ...

  7. 关于 bitset 的一些题目

    参考 http://www.cplusplus.com/reference/bitset/bitset/ https://blog.csdn.net/snowy_smile/article/detai ...

  8. 【最短路】【数学】CSU 1806 Toll (2016湖南省第十二届大学生计算机程序设计竞赛)

    题目链接: http://acm.csu.edu.cn/OnlineJudge/problem.php?id=1806 题目大意: N个点M条有向边,给一个时间T(2≤n≤10,1≤m≤n(n-1), ...

  9. 【最短路】【STL】CSU 1808 地铁 (2016湖南省第十二届大学生计算机程序设计竞赛)

    题目链接: http://acm.csu.edu.cn/OnlineJudge/problem.php?id=1808 题目大意: N个点M条无向边(N,M<=105),每条边属于某一条地铁Ci ...

随机推荐

  1. c# 定义委托和使用委托(事件的使用)

    使用委托时要先实例化,和类一样,使用new关键字产生委托的新实例,然后将一个或者多个与委托签名匹配的方法与委托实例关联.随后调用委托时,就会调用所有与委托实例关联的方法. 与委托关联可以是任何类或者结 ...

  2. git log的常见用法

    git log 使用git log命令,什么参数都没有的话,会以下面的格式输出所有的日志(我当前的git仓库只有三个提交).如果日志特别多的话,在git bash中,按向下键来查看更多,按q键退出查看 ...

  3. JustOj 1994: P1001

    题目描述         给定一个长度为N(0< n< =10000)的序列,保证每一个序列中的数字a[i]是小于maxlongint的非负整数  ,编程要求求出整个序列中第k大的数字减去 ...

  4. Sqring核心概念

    Spring  是大规模企业级框架,用户数量多,数据规模大,功能众多,业务复杂, 性能和安全要求高   灵活多变 Spring框架是轻量级的框架,javaEE的春天,当前主流的框架,一站式的企业应用开 ...

  5. JDK 的配置和反编译工具的使用---------------Java知识点

    初始Java 1995年5月,sun公司开发了一门新的编程语言------Java 詹姆斯.高斯林(Java之父),Java语言小巧安全具有可移植可跨平台性的优点. 开发java程序的步骤:编写 ,编 ...

  6. Fiddler(一)Fiddler介绍及应用场景

    Fiddler是一款网络抓包工具,抓包可以是抓取电脑端请求的数据,还可以抓取移动端(手机APP)的数据包,可以监控HTTP和HTTPS的流量,可以通过浏览器或者客户端软件向服务器发送的HTTP或者HT ...

  7. windows 10下oracle相关异常及处理方法

    话说起来,不以oracle性能优化,数据库维护为主业已经有四五年了,这两年基本上以mysql为主. pl/sql登录后提示空白对话框.将ORACLE_HOME设置为oracle 11g的目录. IMP ...

  8. UI自动化(一)html基础

    前端的三把利器 HTML:赤裸的一个人 CSS:华丽的衣服 JS/JavaScript:赋予这个人的行为,也就是动起来 DOM 就是将页面变成可操 HTML(超文本标记语言) html代码实际上就是一 ...

  9. 【Python042--魔法方法:算术运算】

    一.算术魔法方法的举例 1.加法(__add__)的算术运算调用减法(__sub__)的算术运算,减法(__sub__)的算术运算调用加法(__add__)的算术运算 class New_Init(i ...

  10. 向eclipse的JavaWeb项目中导入jar包

    一:      在你所需的jar包网站下载对应的jar包.如org.apache.commons.lang.jar. 二:复制粘贴到该JavaWeb的WEB-INF目录下的lib目录下,如: 三:右键 ...