ACM学习历程—HDU5521 Meeting(图论)
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=5521
学习菊苣的博客,只粘链接,不粘题目描述了。
题目大意就是一个人从1开始走,一个人从n开始走。让最后相遇的时间最短。
题目就是个最短路,不过唯一不同的是,题目图的描述方式比较特别。
从规模上来看,想把这张图描述成邻接矩阵或者邻接表是不可能的。
必然只能按照题目要求的意思来存。
于是第一步存图的方式,我采用了两个vector数组,(当然此处可以使用链式前向星),一个存了和点相关的集合有哪些in[],即这个点包含在哪些集合里面;一个存了集合里面有哪些点edge[]。
然后就是跑两遍最短路了,这里我采用了优先队列的spfa(貌似就是优先队列的dijikstra)。
不过直接这样上去T了好多发。
然后考虑到用了优先队列后,相当于优化了这个dp的过程,让每个点只需要遍历一次。那么,自然而然的,如果i遍历了集合s里面的所有点,自然集合s也只需要遍历一次。加了这一个剪枝就能AC了。由于遍历集合的时候,不是按照从最小权值集合开始的,所以这里没有对队列里面的元素进行判重,不过影响不是很大。
代码:
#include <iostream>
#include <cstdio>
#include <cstring>
#include <cmath>
#include <algorithm>
#include <set>
#include <queue>
#include <vector>
#define LL long long using namespace std; struct node
{
int id, val;
bool operator<(const node x) const
{
return val>x.val;
}
};
const int maxN = ;
const int maxM = ;
int n, m;
vector<int> in[maxN];
int dis[maxM];
vector<int> edge[maxM];
LL p[][maxN];
bool vis[maxM]; void input()
{
scanf("%d%d", &n, &m);
int t, s, k;
for (int i = ; i < m; ++i)
{
scanf("%d%d", &t, &s);
dis[i] = t;
for (int j = ; j < s; ++j)
{
scanf("%d", &k);
in[k].push_back(i);
edge[i].push_back(k);
}
}
memset(p, -, sizeof(p));
} void spfa(int from, int x)
{
memset(vis, false, sizeof(vis));
priority_queue<node> q;
node k, t;
int w, u, v;
k.id = from;
k.val = ;
q.push(k);
p[x][from] = ;
while (!q.empty())
{
k = q.top();
q.pop();
u = k.id;
for (int i = ; i < in[u].size(); ++i)
{
w = in[u][i];
if (vis[w]) continue;
for (int j = ; j < edge[w].size(); ++j)
{
v = edge[w][j];
if (u == v) continue;
if (p[x][v] == - || p[x][v] > p[x][u]+dis[w])
{
p[x][v] = p[x][u]+dis[w];
t.id = v;
t.val = p[x][v];
q.push(t);
}
}
vis[w] = true;
}
}
} LL myMin(LL x, LL y)
{
if (x == -) return y;
else return min(x, y);
} void work()
{
spfa(, );
spfa(n, );
LL mi = -;
for (int i = ; i <= n; ++i)
if (p[][i] != - && p[][i] != -)
mi = myMin(mi, max(p[][i], p[][i]));
if (mi == -)
{
printf("Evil John\n");
return;
}
printf("%d\n", mi);
bool flag = false;
for (int i = ; i <= n; ++i)
if (p[][i] != - && p[][i] != - && mi == max(p[][i], p[][i]))
{
if (flag) printf(" ");
printf("%d", i);
flag = true;
}
printf("\n");
} void clss()
{
for (int i = ; i < m; ++i)
edge[i].clear();
for (int i = ; i <= n; ++i)
in[i].clear();
} int main()
{
//freopen("test.in", "r", stdin);
int T;
scanf("%d", &T);
for (int times = ; times < T; ++times)
{
printf("Case #%d: ", times+);
input();
work();
clss();
}
return ;
}
ACM学习历程—HDU5521 Meeting(图论)的更多相关文章
- 完成了C++作业,本博客现在开始全面记录acm学习历程,真正的acm之路,现在开始
以下以目前遇到题目开始记录,按发布时间排序 ACM之递推递归 ACM之数学题 拓扑排序 ACM之最短路径做题笔记与记录 STL学习笔记不(定期更新) 八皇后问题解题报告
- ACM学习历程—HDU 5512 Pagodas(数学)
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=5512 学习菊苣的博客,只粘链接,不粘题目描述了. 题目大意就是给了初始的集合{a, b},然后取集合里 ...
- ACM学习历程—HDU2476 String painter(动态规划)
http://acm.hdu.edu.cn/showproblem.php?pid=2476 题目大意是给定一个起始串和一个目标串,然后每次可以将某一段区间染成一种字符,问从起始串到目标串最少需要染多 ...
- ACM学习历程—HDU5700 区间交(树状数组 && 前缀和 && 排序)
http://acm.hdu.edu.cn/showproblem.php?pid=5700 这是这次百度之星初赛2B的第五题.省赛回来看了一下,有这样一个思路:对于所有的区间排序,按左值排序. 然后 ...
- ACM学习历程—HDU5701 中位数计数(中位数 && 计数排序)
http://acm.hdu.edu.cn/showproblem.php?pid=5701 这是这次百度之星初赛2B的第六题.之前白山云做过类似的题,省赛完回来,我看了一下大概就有这样的思路:首先枚 ...
- ACM学习历程—HDU5696 区间的价值(分治 && RMQ && 线段树 && 动态规划)
http://acm.hdu.edu.cn/showproblem.php?pid=5696 这是这次百度之星初赛2B的第一题,但是由于正好打省赛,于是便错过了.加上2A的时候差了一题,当时有思路,但 ...
- ACM学习历程—HDU5668 Circle(数论)
http://acm.hdu.edu.cn/showproblem.php?pid=5668 这题的话,假设每次报x个,那么可以模拟一遍, 假设第i个出局的是a[i],那么从第i-1个出局的人后,重新 ...
- ACM学习历程—HDU5667 Sequence(数论 && 矩阵乘法 && 快速幂)
http://acm.hdu.edu.cn/showproblem.php?pid=5667 这题的关键是处理指数,因为最后结果是a^t这种的,主要是如何计算t. 发现t是一个递推式,t(n) = c ...
- ACM学习历程—HDU5666 Segment(数论)
http://acm.hdu.edu.cn/showproblem.php?pid=5666 这题的关键是q为质数,不妨设线段上点(x0, y0),则x0+y0=q. 那么直线方程则为y = y0/x ...
随机推荐
- 什么是bin文件?
知道多问bin文件几个为什么.是在出现下面这个问题时引发的. 出现这种问题:未能载入文件或程序集"DAL"或它的某一个依赖项. 系统找不到指定的文件 ...
- Jmeter查看QPS和响应时间随着时间的变化曲线
以下两个插件提供测试结果,扩展图表显示 --- Response Times Over Time --- Transactions per Second 1.打开 https://jmeter-plu ...
- (比赛)B - Super Mobile Charger
B - Super Mobile Charger Time Limit:1000MS Memory Limit:32768KB 64bit IO Format:%I64d & ...
- Latent Activity Trajectory (LAT)
https://www.microsoft.com/en-us/research/wp-content/uploads/2016/02/funcZone_TKDE_Zheng.pdf Specific ...
- tfboys——tensorflow模块学习(一)
Tensorflow的基本使用 TensorFlow 的特点: 使用图 (graph) 来表示计算任务. 在被称之为 会话 (Session) 的上下文 (context) 中执行图. 使用 tens ...
- valuestack,stackContext,ActionContext.之间的关系以及action的数据在页面中取得的方法
转自:http://blog.csdn.net/quechao123/article/details/4406148 1.三者之间的关系如下图所示: 2.action的数据在页面中取得的方法 在st ...
- 读:Instance-aware Image and Sentence Matching with Selective Multimodal LSTM
摘要:有效图像和句子匹配取决于如何很好地度量其全局视觉 - 语义相似度.基于观察到这样的全局相似性是由图像(对象)和句子(词)的成对实例之间的多个局部相似性的复合聚集,我们提出了一个实例感知图像和句子 ...
- crontab定时任务(待补充)
cron是一个ubuntu下的后台进程,用来定期的执行一些任务 想让cron执行你指定的任务,首先就要编辑crontab文件.crontab是一个文本文件,用来存放你要运行的命令 第一种 vim /e ...
- 每天一个Linux命令(21)find命令_xargs参数
xargs 与 exec 的作用类似,但是xargs与find 一起使用时,一般配合管道一起使用. 前面的输出转换为后方指令的参数输入,使用exec和xargs可以使用户对所匹配到的文件执行几乎所有的 ...
- m3u8格式转MP4
公司直播平台使用的是七牛直播,今天有客户表示想将直播回放视频下载下来,数据妹子犯了愁,表示这个不会下载给客户,于是乎这个任务就落在了我的头上.熟练的打开视频,在 HTML 源代码播放地址为 http: ...