学习最短路建图 HUD 5521
http://acm.hdu.edu.cn/showproblem.php?pid=5521
题目大意:有n个点,m个集合,每个集合里面的点都两两可达且每条边权值都是val,有两个人A, B,A在pos=1,B在pos=n,问两者相遇的最短时间,输出相遇地点,如果有多个最短时间,输出的相遇地点按从小到大排序。
思路:因为集合暴力枚举点肯定mle。所以我不会TAT(我好菜啊)。于是看了一下别人的想法, 就是新建一个节点,然后让集合里面的所有节点都连向他, 然后权值定为和原来的权值一样,也是val(但是最后的ans要除以2)。 TAT,既然我都已经刷过网络流了,既然这个都没有想到
接下来就简单了。。。dijstra跑两次就好了= =
//看看会不会爆int!数组会不会少了一维!
//取物问题一定要小心先手胜利的条件
#include <bits/stdc++.h>
using namespace std;
#define LL long long
#define ALL(a) a.begin(), a.end()
#define pb push_back
#define mk make_pair
#define fi first
#define se second
#define haha printf("haha\n")
const LL inf = 1e17;
const int maxn = 2e6 + ;
struct Edge{
int from, to; LL val;
Edge(int f = , int t = , LL val = ): from(f), to(t), val(val){}
};
struct Point{
int from; LL val;
Point(int f = , LL val = ): from(f), val(val){}
bool operator < (const Point &a) const{
return val > a.val;
}
};
vector<Edge> G[maxn];
int kase, n, m;
int a[maxn]; void build(int newpoint, int cnt, LL t){
for (int i = ; i <= cnt; i++){
G[a[i]].push_back(Edge(a[i], newpoint, t));
G[newpoint].push_back(Edge(newpoint, a[i], t));
}
}
LL d[maxn], d1[maxn], d2[maxn];
void dijstra(int s){
for (int i = ; i <= n + m; i++){
d[i] = inf;
}
d[s] = ;
priority_queue<Point> que;
que.push(Point(s, d[s]));
while (!que.empty()){
Point u = que.top(); que.pop();
int len = G[u.from].size();
for (int i = ; i < len; i++){
Edge p = G[u.from][i];
int v = p.to;
if (d[v] > d[u.from] + p.val){
d[v] = d[u.from] + p.val;
que.push(Point(v, d[v]));
}
}
}
} void solve(){
dijstra();
for (int i = ; i <= n; i++) d1[i] = d[i];
dijstra(n);
for (int i = ; i <= n; i++) d2[i] = d[i];
LL minival = inf;
for (int i = ; i <= n; i++){
minival = min(minival, max(d1[i], d2[i]));
}
if (minival == inf) {
printf("Case #%d: Evil John\n", ++kase);
return ;
}
vector<int> v;
for (int i = ; i <= n; i++){
if (minival == max(d1[i], d2[i])) v.push_back(i);
}
printf("Case #%d: %I64d\n", ++kase, minival / );
for (int i = ; i < v.size(); i++){
printf("%d%c", v[i], i == v.size() - ? '\n' : ' ');
}
} int main(){
int T; cin >> T;
while (T--){
scanf("%d%d", &n, &m);
for (int i = ; i <= n + m; i++) G[i].clear();
for (int i = ; i <= m; i++){
LL t; int cnt; scanf("%I64d%d", &t, &cnt);
for (int j = ; j <= cnt; j++){
scanf("%d", a + j);
}
build(i + n, cnt, t);
}
solve();
}
return ;
}
学习最短路建图 HUD 5521的更多相关文章
- HDU 5521 [图论][最短路][建图灵感]
/* 思前想后 还是决定坚持写博客吧... 题意: n个点,m个集合.每个集合里边的点是联通的且任意两点之间有一条dis[i]的边(每个集合一个dis[i]) 求同时从第1个点和第n个点出发的两个人相 ...
- hdu4725 The Shortest Path in Nya Graph【最短路+建图】
转载请注明出处,谢谢:http://www.cnblogs.com/KirisameMarisa/p/4297574.html ---by 墨染之樱花 题目链接:http://acm.hdu ...
- Codeforces 938D. Buy a Ticket (最短路+建图)
<题目链接> 题目大意: 有n座城市,每一个城市都有一个听演唱会的价格,这n座城市由m条无向边连接,每天变都有其对应的边权.现在要求出每个城市的人,看一场演唱会的最小价值(总共花费的价值= ...
- HDU5521-最短路-建图
Meeting Time Limit: 12000/6000 MS (Java/Others) Memory Limit: 262144/262144 K (Java/Others)Total ...
- hdu 5294 Tricks Device 最短路建图+最小割
链接:http://acm.hdu.edu.cn/showproblem.php?pid=5294 Tricks Device Time Limit: 2000/1000 MS (Java/Other ...
- hdu 4725 The Shortest Path in Nya Graph (最短路+建图)
The Shortest Path in Nya Graph Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K ...
- 第八届河南省赛C.最少换乘(最短路建图)
C.最少换乘 Time Limit: 2 Sec Memory Limit: 128 MB Submit: 94 Solved: 25 [Submit][Status][Web Board] De ...
- 『The Captain 最短路建图优化』
The Captain(BZOJ 4152) Description 给定平面上的n个点,定义(x1,y1)到(x2,y2)的费用为min(|x1-x2|,|y1-y2|),求从1号点走到n号点的最小 ...
- HDU-4725.TheShortestPathinNyaGraph(最短路 + 建图)
本题思路:主要是建图比较麻烦,因为结点可以在层与层之间走动,也可以在边上进行走动,所以主要就是需要找到一个将结点和层统一化处理的方法. 所以我们就可以对于存在边的结点建边,层与层之间如果层数相差一也建 ...
随机推荐
- android设置组件透明度
textremind.setBackgroundColor(Color.argb(178, 0, 0, 0)); //背景透明度 textremind.setTextColor(Color.argb ...
- 如何使用Java、Servlet创建二维码
归功于智能手机,QR码逐渐成为主流,它们正变得越来越有用.从候车亭.产品包装.家装卖场.汽车到很多网站,都在自己的网页集成QR码,让人们快速找到它们.随着智能手机的用户量日益增长,二维码的使用正在呈指 ...
- Var x;---定义变量
变量定义有多种格式 <!DOCTYPE html> <html> <head> <meta charset="utf-8"> < ...
- Token验证失败的解决方法
Token验证失败 微信 微信公众平台开发 Token校验失败 URL Token原文 http://www.cnblogs.com/txw1958/p/token-verify.html Token ...
- c# 方法重载
在c#中同样的方法名称不一样的参数数量和类型可以实现方法重载 class ResultDisplayer{void DisplayResult(string result){// implementa ...
- JavaEE 配置文件 应用首选项存储
JavaEE 配置文件 应用首选项存储 @author ixenos 什么是首选项? 首选项Preferences 指配置信息 首选项存储就是指对配置信息的存储 有什么方式存储? 有两种,一种存于 ...
- JVM基础(6)-常用参数总结
参考文章: 并发编程网:http://ifeve.com/useful-jvm-flags-part-4-heap-tuning/ 一.参数分类 HotSpot JVM 提供了三类参数. 第一类包括了 ...
- kettle连接mysql
kettle连接mysql时出现问题
- C# 循环语句
本次主要学习了for循环语句. for循环语句的基本格式是: for(初始条件;循环条件;状态改变) { 循环体; } break——中断循环,跳出循环. continue——停止本次循环,进入下次循 ...
- 7.编写Java应用程序。首先,定义一个Print类,它有一个方法void output(int x),如果x的值是1,在控制台打印出大写的英文字母表;如果x的值是2,在 控制台打印出小写的英文字母表。其次,再定义一个主类——TestClass,在主类 的main方法中创建Print类的对象,使用这个对象调用方法output ()来打印出大 小写英文字母表。
package com.bao; public class Print1 { int x; void output() { if(x==1) { System.out.println("AB ...