今天旁观了Angry_Newbie的模拟区域赛(2015shenyang)

倒着看最先看的M题,很明显的最短路问题,在我看懂的时候他们已经开始敲B了。

后来听说D过了很多人。。

D题一看是个博弈,给了很多组样例,找找规律懵一懵就ac了。然后我就滚粗了。。。

而他们也早就A了D,很快他们又A了B。。。

后来就全程看着罗大神敲无限TLE的M。感觉算法肯定没错,但是想不到哪里还可以优化。

后来我滚了之后听说他们也成功AC了M。

下来仔细想想M也并不是难题,如果平时做的话,肯定不会卡那么久的。。。


A REALLY LONG WAY TO GO


题目链接:

http://acm.hdu.edu.cn/showproblem.php?pid=5521

题意:

有n个块,m个块集,每个块集中的块相连且之间的距离相等,一个人在1号块,另一个人在n号块,求两人同时出发,在哪个块会面两人走的距离最小?

分析:

两头开始走的,直接求两次dijkstra。

在更新每块的时候更新该块所在块集中的其他点的距离。

但是边很多,有很多无用的边,当时一直在纠结如何处理那些无用的边。

但是,仔细想想,dijkstra的思想就是利用已经求出最短距离的点,求出与之相邻的点的距离。而对于每块而言,如果已经更新过该块集,那块集中的所有点目前为止已经处于最短路状态,无需再次对该块集进行更新了, 即每个块集最多松弛一次。。这样就避免了块集无用的重复访问。。大大优化。。

代码:

#include<cstdio>
#include<vector>
#include<iostream>
#include<cstring>
#include<queue>
using namespace std;
typedef long long ll;
const int maxn = 1e5 + 5;
#define INF 1e15
ll dist[maxn][2];
int vis[maxn];
vector<int>block[maxn];
vector<int>lable[maxn];
int n, m;
int t[maxn];
typedef pair<int, long long>p;
void dijkstra(int s, int flag)
{
for(int i = 1; i <= n; i++) dist[i][flag] = INF;
memset(vis, 0, sizeof(vis));
priority_queue<p,vector<p>, greater<p> >q;
q.push(p(0, s));
dist[s][flag] = 0;
while(!q.empty()){
p tt = q.top();q.pop();
int v = tt.second;
if(dist[v][flag] < tt.first) continue;
for(int i = 0; i < block[v].size(); i++){
int a = block[v][i];
if(vis[a]) continue;
vis[a] = 1;
for(int j = 0 ; j < lable[a].size(); j++){
if(lable[a][j] == v) continue;
int u = lable[a][j];
if(dist[u][flag] > dist[v][flag] + t[a]){
dist[u][flag] = dist[v][flag] + t[a];
q.push(p(dist[u][flag], u));
}
}
}
}
}
int main (void)
{
int T;scanf("%d", &T);
int cnt = 1;
while(T--){
scanf("%d%d", &n, &m);
int s, a;
for(int i = 1; i <= n; i++)
block[i].clear();
for(int i = 1; i <= m; i++){
lable[i].clear();
}
for(int i = 1; i <= m; i++){
scanf("%d%d", &t[i], &s);
for(int j = 0; j < s; j++){
scanf("%d", &a);
block[a].push_back(i);
lable[i].push_back(a);
}
}
dijkstra(1, 0);
dijkstra(n, 1);
ll ans = INF;
for(int i = 1; i <= n; i++)
ans = min(ans, max(dist[i][0], dist[i][1])); vector<int>v;
printf("Case #%d: ", cnt++);
if(ans == INF) printf("Evil John\n");
else{
printf("%I64d\n", ans);
for(int i = 1; i <= n; i++){
if(ans == max(dist[i][0], dist[i][1])){
v.push_back(i);
}
}
for(int i = 0; i < v.size(); i++){
printf("%d%c", v[i], i == v.size() - 1?'\n':' ');
}
}
}
return 0;
}

HDU 5521 Meeting【最短路】的更多相关文章

  1. HDU 5521.Meeting 最短路模板题

    Meeting Time Limit: 12000/6000 MS (Java/Others)    Memory Limit: 262144/262144 K (Java/Others)Total ...

  2. HDU 5521 Meeting(虚拟节点+最短路)

    Meeting Time Limit: 12000/6000 MS (Java/Others)    Memory Limit: 262144/262144 K (Java/Others) Total ...

  3. hdu 5521 Meeting(最短路)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=5521 题意:有1-n共n个点,给出m个块(完全图),并知道块内各点之间互相到达花费时间均为ti.已知两 ...

  4. HDU 5521 Meeting (最短路,dijstra)

    题意:有N个点,两个人,其中一个人住在点1,另一个人住在点n,有M个点集,集合内的数表示任意两点的距离为dis ,现在问,如果两个人要见面, 需要最短距离是多少,有哪几个点能被当成见面点. 析:分别对 ...

  5. HDU 5521 [图论][最短路][建图灵感]

    /* 思前想后 还是决定坚持写博客吧... 题意: n个点,m个集合.每个集合里边的点是联通的且任意两点之间有一条dis[i]的边(每个集合一个dis[i]) 求同时从第1个点和第n个点出发的两个人相 ...

  6. HDU 5521 Meeting

    2015 ACM / ICPC 沈阳站现场赛 M题 最短路 设置N+M个节点,前N个节点是Block,后M个节点是Set,每一组Set中的点向该Set连边,从1和n开始分别求最短路.注意爆int. # ...

  7. HDU - 5521 Meeting (Dijkstra)

    思路: 看了好久才看懂题意,文中给了n个点,有m个集合,每个集合有s个点,集合内的每两个点之间有一个权值为t的边,现在有两个人,要从1号点,和n号点,走到同一个顶点,问最少花费以及花费最少的点. 那就 ...

  8. HDU 5521:Meeting(最短路)

    http://acm.hdu.edu.cn/showproblem.php?pid=5521 Meeting Problem Description   Bessie and her friend E ...

  9. hdu 5521 最短路

    Meeting Time Limit: 12000/6000 MS (Java/Others)    Memory Limit: 262144/262144 K (Java/Others)Total ...

随机推荐

  1. Java垃圾回收机制分析

    Java的堆是一个运行时数据区,类的实例从中分配空间,堆中存储着正在运行的应用程序所建立的所有对象.垃圾回收是一种动态存储管理技术.它按照特定的垃圾回收算法,自动释放掉不再被引用的对象.堆内存里垃圾的 ...

  2. laravel核心思想

    服务容器.依赖注入.门脸模式 服务容器 容器概念 用来装一个个实例的对象,比如邮件类. IOC控制反转 IOC(Inversion of Control)控制反转,面向对象,可降低代码之间的耦合度,借 ...

  3. PowerBI 应用时间智能(生成日期表)

    简介 Power BI Desktop -是一款由微软发布的自助式商业智能工具,功能强大.易于使用.其中还可以通过微软云连多个数据源并且使用数据源来创建可视化表盘. 但是几乎所有的BI都需要展示如何随 ...

  4. Elasticsearch 插入地理索引文档一直为空

    今天在获取插入索引数据的时候,一直提示插入不成功,尝试了很多方法,原来是因为在插入的时候应该先 插入Latitude后插入longitude修改后的代码如下 public boolean insert ...

  5. 解决异常System.Runtime.Interopservices.COMException RequestLock问题

    工具——导入导出设置,重置调试设置就可以了,这是调试文件的异常

  6. hql语法001

    1. import java.util.List; import org.hibernate.*; import org.junit.Test; import cn.jbit.hibernatedem ...

  7. 朴素贝叶斯法(naive Bayes)

    <统计学习方法>(第二版)第4章 4 朴素贝叶斯法 生成模型 4.1 学习与分类 基于特征条件独立假设学习输入输出的联合概率分布 基于联合概率分布,利用贝叶斯定理求出后验概率最大的输出 条 ...

  8. mean shift博客推荐

    https://blog.csdn.net/maweifei/article/details/78766784 https://blog.csdn.net/gdfsg/article/details/ ...

  9. Spring-01 注解实现IOC

    Spring框架四大原则 使用pojo进行轻量级和最小侵入式开发. 通过依赖注入和基于接口编程实现松耦合. 使用AOP和默认习惯进行声明式编程. 使用AOP和模板(template)减少模式化代码. ...

  10. OpenCV2:第六章 图像几何变换

    一.简介 图像的几何变换有距离变换 坐标映射 平移  镜像 旋转  缩放  仿射变换等 二.重映射 把一张图像重新排列像素,比如倒置 CV_EXPORTS_W void remap( InputArr ...