HDU - 5521 Meeting (Dijkstra)
思路:
看了好久才看懂题意,文中给了n个点,有m个集合,每个集合有s个点,集合内的每两个点之间有一个权值为t的边,现在有两个人,要从1号点,和n号点,走到同一个顶点,问最少花费以及花费最少的点。
那就直接跑两遍最短路,然后枚举每一点,取最短路最大值最小的点。
然而这么浅显的做法却MLE啦,真是用心险恶的出题人呀。
其实仔细想一想就知道了,题目的要求是,每个集合里面,都是一个完全图,如果只有一个集合,那么2e5个点,边的条数就是4e10条,爆内存简直是必然的。所以需要在建图的时候优化,或者是换一种算法。如果要在建图的时候优化,那么就要忽视那些,在集合内,却没有与其他集合相连的点。如何找出这些点呢?很容易想到,如果一个点在输入的数据中出现了两次或以上,那么它一定是与其他集合有关的,但是如何记录这些点是一个很大的问题。如果用数组记录下每个集合有哪些点,或者每个点属于哪些集合,很明显都是不行的,但是如果使用vector呢?既然题目中已经提到了,s的和不会超过1e6,那么这样或许是可行的。我首先尝试了一下,记录下每个集合有哪些点。
然而还是炸了内存。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。
自闭。
回来再想一想,好像还是没有最开始的完全图问题,因为这数据可以有两个集合,而这两个集合都是满的。。。。。(好歹毒呀)
最后我还是无耻得看了一下其他人的题解.了解了一种可以大幅减少完全图的边数.方法就是,在每一个完全图的边上,建一个虚拟点,让每一点去虚拟点的距离就是t,回来是0.如果是一般情况,也就是说,点到点之间的距离不相等的话,这个方法貌似就无法使用啦.
代码:
- #include<iostream>
- #include<algorithm>
- #include<vector>
- #include<queue>
- #include<deque>
- #include<stack>
- #include<map>
- #include<set>
- #include<cstdio>
- #include<cstring>
- #include<cmath>
- #include<cstdlib>
- #define fuck(x) cout<<#x<<" = "<<x<<endl;
- using namespace std;
- typedef long long ll;
- typedef unsigned long long ull;
- const int maxn = ;
- const int inf = 1.0e9+;
- const ll INF = ;
- const double eps = 1e-;
- int n,m;
- ll diss1[maxn],diss2[maxn];
- int num[maxn];
- vector<int>u[maxn];
- vector<ll>w[maxn];
- bool book[*maxn];
- void init()
- {
- for(int i=;i<=n*;i++){
- u[i].clear();
- w[i].clear();
- diss1[i]=diss2[i]=INF;
- }
- }
- struct node
- {
- int x;
- ll s;
- bool operator<(const node p)const{return p.s<s;}
- };
- int Dijkstra(int sx,ll *dis)
- {
- memset(book,,sizeof(book));
- dis[sx]=0ll;
- priority_queue<node>q;
- node exa;
- exa.x=sx;
- exa.s=0ll;
- q.push(exa);
- while(!q.empty()){
- exa=q.top();q.pop();
- if(book[exa.x]){continue;}
- book[exa.x]=true;
- int t=exa.x;
- int siz=u[t].size();
- for(int i=;i<siz;i++){
- if(dis[u[t][i]]>dis[t]+w[t][i]){
- dis[u[t][i]]=dis[t]+w[t][i];
- exa.s=dis[u[t][i]];
- exa.x=u[t][i];
- q.push(exa);
- }
- }
- }
- }
- int main()
- {
- // ios::sync_with_stdio(false);
- // freopen("in.txt","r",stdin);
- int T;
- scanf("%d",&T);
- int cases = ;
- while(T--){
- cases++;
- scanf("%d%d",&n,&m);
- init();
- for(int i=;i<=m;i++){
- int ss;
- ll t;
- scanf("%lld%d",&t,&ss);
- for(int j=;j<=ss;j++){
- scanf("%d",&num[j]);
- }
- for(int j=;j<=ss;j++){
- u[num[j]].push_back(n+i);
- w[num[j]].push_back(t);
- u[n+i].push_back(num[j]);
- w[n+i].push_back();
- }
- }
- Dijkstra(,diss1);
- Dijkstra(n,diss2);
- ll ans = INF;
- for(int i=;i<=n;i++){
- diss1[i]=max(diss1[i],diss2[i]);
- ans=min(ans,diss1[i]);
- }
- printf("Case #%d: ",cases);
- if(ans ==INF){printf("Evil John\n");continue;}
- else printf("%lld\n",ans);
- vector<int>anss;
- for(int i=;i<=n;i++){
- if(ans==diss1[i]){anss.push_back(i);}
- }
- int siz = anss.size();
- for(int i=;i<siz-;i++){
- printf("%d ",anss[i]);
- }
- printf("%d\n",anss[siz-]);
- }
- return ;
- }
∑mi=1Si≤10
HDU - 5521 Meeting (Dijkstra)的更多相关文章
- HDU 5521 Meeting(虚拟节点+最短路)
Meeting Time Limit: 12000/6000 MS (Java/Others) Memory Limit: 262144/262144 K (Java/Others) Total ...
- HDU 5521.Meeting 最短路模板题
Meeting Time Limit: 12000/6000 MS (Java/Others) Memory Limit: 262144/262144 K (Java/Others)Total ...
- HDU 5521 Meeting【最短路】
今天旁观了Angry_Newbie的模拟区域赛(2015shenyang) 倒着看最先看的M题,很明显的最短路问题,在我看懂的时候他们已经开始敲B了. 后来听说D过了很多人.. D题一看是个博弈,给了 ...
- hdu 5521 Meeting(最短路)
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=5521 题意:有1-n共n个点,给出m个块(完全图),并知道块内各点之间互相到达花费时间均为ti.已知两 ...
- HDU 5521 Meeting (最短路,dijstra)
题意:有N个点,两个人,其中一个人住在点1,另一个人住在点n,有M个点集,集合内的数表示任意两点的距离为dis ,现在问,如果两个人要见面, 需要最短距离是多少,有哪几个点能被当成见面点. 析:分别对 ...
- HDU 5521 Meeting
2015 ACM / ICPC 沈阳站现场赛 M题 最短路 设置N+M个节点,前N个节点是Block,后M个节点是Set,每一组Set中的点向该Set连边,从1和n开始分别求最短路.注意爆int. # ...
- HDU 5521:Meeting(最短路)
http://acm.hdu.edu.cn/showproblem.php?pid=5521 Meeting Problem Description Bessie and her friend E ...
- hdu 5521 最短路
Meeting Time Limit: 12000/6000 MS (Java/Others) Memory Limit: 262144/262144 K (Java/Others)Total ...
- Meeting HDU - 5521 虚点建图
Problem Description Bessie and her friend Elsie decide to have a meeting. However, after Farmer John ...
随机推荐
- python之if使用方法举例
if使用方法举例: import random #随机生成1-100的整数 n = random.randint(1, 100) if n > 50: print(n, "> 5 ...
- ES 6 系列 - 变量声明
let 和 const let 声明 (一)基本用法 let 声明的变量只在块级作用域内有效,出了该块则报错,最常见且适合的地方在 for 循环中: var a = []; for (var i = ...
- poj-3080(kmp+暴力枚举)
题意:给你多个字符串,问你这几个字符串的最长公共子串是哪个,如果有多个,输出字典序最大的那个,如果最长的公共子串长度小于3,输出一个奇怪的东西: 解题思路:首先看数据,数据不大,开始简单快乐的暴力之路 ...
- python生成器中yield和send分析
生成器 在python中生成器是指用代码实现迭代器的的功能本质还是迭代器,只不过是代码实现迭代器功能.在python中生成器是由函数实现的,通常我们在函数中加入yeild就可以实现生成器. 生成器中y ...
- spring boot项目基本结构
/==================================Controller @Controller public class SimpleController { @Autowired ...
- HDU5769-Substring-多校#4-1006-后缀数组
给定一个字符x和一个字符串.要求输出包含此字符的所有不同字串. 后缀数组可以计算一个字符串的所有不同字串,理解了原理就能做这题了. 对于每一个后缀i,将产生len-sa[i]-hight[i]的前缀, ...
- Python内建GUI模块Tkinter(二)
Python核心组件 1.Button 按钮组件:一个简单的按钮,用来执行一个命令或别的操作. 参数解析: text:指定按钮上显示的文本: anchor: 指定按钮上文本的位置(N, NE, E, ...
- bzoj 4196 [Noi2015]软件包管理器 (树链剖分+线段树)
4196: [Noi2015]软件包管理器 Time Limit: 10 Sec Memory Limit: 512 MBSubmit: 2852 Solved: 1668[Submit][Sta ...
- IDEA修改module的名字
首先右键module名,选择[Refactor]-[Rename...] 然后选择[Rename module] 只修改这些对于当前开发是没有问题了 但是刚开始把module添加成maven项目的时候 ...
- Gogs 部署安装(Linux)
环境 centos7:golang+mysqldb+git. 安装配置环境[mysql装了请跳过] yum install mysql-community-server go git -y 配置防火墙 ...