题目链接:点击查看

题目大意:给出 n 个点,再给出 m 个集合,对于每个集合中的点来说,其两两都是相互可达的,且花费都相同,问有多少个点,到达点 1 和点 n 的距离相同且最小

题目分析:因为每个集合都是一个完全图,所以直接建图是 n * n 级别的,肯定不可行,又因为我们在求出答案之前,显然是需要正向从点 1 跑一遍迪杰斯特拉,跑出点 1 到每个点的最短距离 d1[ i ] ,然后再从点 n 跑出点 n 到每个点的最短距离 d[ i ] ,剩下的扫一遍维护一下最小值就可以了

那么当务之急是如何不建出整个图,从而求迪杰斯特拉呢,训练的时候我猜了个结论,也就是每个集合至多遍历一次,所以我就改了改迪杰斯特拉的内部实现,没想到就过了。。为什么这样能过呢(乱写的).jpg

因为不会证明上述算法的正确性,所以赛后看民间题解又整理了一种解法

对于每个集合而言,可以建立一个虚拟节点用来连接一个集合中的所有点,以保证任意两个点可以互达,每个点到达虚拟节点的边权为对应的边权,虚拟节点到达每个节点的边权为 0 ,这样最后就能建出一张 n + m 个点的有向图了,剩下的直接跑迪杰斯特拉就好了

代码:

#pragma GCC optimize(2)
#pragma GCC optimize("Ofast","inline","-ffast-math")
#pragma GCC target("avx,sse2,sse3,sse4,mmx")
#include<iostream>
#include<cstdio>
#include<string>
#include<ctime>
#include<cmath>
#include<cstring>
#include<algorithm>
#include<stack>
#include<climits>
#include<queue>
#include<map>
#include<set>
#include<sstream>
#include<cassert>
#include<bitset>
#include<unordered_map>
using namespace std;typedef long long LL;typedef unsigned long long ull;const LL inf=0x3f3f3f3f3f3f3f3f;const int N=2e5+100;//顶点数 const int M=2e6+100;//边数 LL d1[N],d[N];vector<int>res;template<typename T>
struct Dij
{const static int N=2e5+100;const static int M=2e6+100;struct Edge{int to,next;T w;}edge[M];int head[N],cnt;//链式前向星 T d[N];bool vis[N];void addedge(int u,int v,T w){edge[cnt].to=v;edge[cnt].w=w;edge[cnt].next=head[u];head[u]=cnt++;}struct Node{int to;T w;Node(int TO,T W){to=TO;w=W;}bool operator<(const Node& a)const{return w>a.w;}};void Dijkstra(int st){priority_queue<Node>q;memset(vis,false,sizeof(vis));memset(d,0x3f,sizeof(d));d[st]=0;q.push(Node(st,0));while(q.size()){Node cur=q.top();int u=cur.to;q.pop();if(vis[u])continue;vis[u]=true;for(int i=head[u];i!=-1;i=edge[i].next)//扫描出所有边 {int v=edge[i].to;T w=edge[i].w;if(d[v]>d[u]+w)//更新 {d[v]=d[u]+w;q.push(Node(v,d[v]));}}}}void init(){memset(head,-1,sizeof(head));cnt=0; }
};Dij<LL>t;int main()
{
#ifndef ONLINE_JUDGE
//  freopen("data.in.txt","r",stdin);
//  freopen("data.out.txt","w",stdout);
#endif
//  ios::sync_with_stdio(false);int w;cin>>w;int kase=0;while(w--){t.init();int n,m;scanf("%d%d",&n,&m);for(int i=1;i<=m;i++){int w,num;scanf("%d%d",&w,&num);while(num--){int x;scanf("%d",&x);t.addedge(x,n+i,w);t.addedge(n+i,x,0);}}t.Dijkstra(1);for(int i=1;i<=n;i++)d1[i]=t.d[i];t.Dijkstra(n);for(int i=1;i<=n;i++)d[i]=t.d[i];LL ans=inf;for(int i=1;i<=n;i++){if(ans>max(d1[i],d[i])){ans=max(d1[i],d[i]);res.clear();res.push_back(i);}else if(ans==max(d1[i],d[i]))res.push_back(i);}if(ans==inf)printf("Case #%d: Evil John\n",++kase);else{printf("Case #%d: %lld\n",++kase,ans);for(int i=0;i<res.size();i++)printf("%d%c",res[i],i==res.size()-1?'\n':' ');}}return 0;
}

HDU - 5521 Meeting(最短路+思维建边)相关推荐

  1. HDU 4725 层级最短路 思维建图 邻接表 堆优化迪杰斯特拉 真的难想 区域网络赛真题

    题目 题解思路 知道是最短路,怎么建图呢? 一开始想到每层来一个超级源点,但是方向不知道怎么确定,用双向边果然WA了(如果是双向边,那一层的都会变成0费连通了 ). 翻了翻 大佬的博客 大佬定义了一种 ...

  2. hdu 5521 Meeting(最短路)

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

  3. CodeForces - 1529F It‘s a bird! No, it‘s a plane! No, it‘s AaParsa!(最短路+思维建图)

    题目链接:点击查看 题目大意:给出 nnn 个点(从 000 开始编号)和 mmm 条边的有向带权图,不过 mmm 条边是动态的,经过 ttt 秒后,第 iii 条边就从 ai−>bi,cia_ ...

  4. CodeForces - 1422D Returning Home(最短路+思维建图)

    题目链接:点击查看 题目大意:给出一个 n * n 的二维平面,现在要从点 ( sx , sy ) 到达点 ( fx , fy ),在平面上有 m 个传送门,共有两次操作: 向上.下.左.右移动一个单 ...

  5. HDU - 4292 Food(最大流+思维建边)

    题目链接:点击查看 题目大意:作为食堂管理人,现在有n个学生需要打饭,每个学生需要一个饮料和食物才能满足,每个学生可以同时接受多种不同的食物和饮料,现在给出每种食物和饮料的个数,问最多能让多少学生满足 ...

  6. Meeting HDU - 5521

    Meeting HDU - 5521 题意: 一共有n个点,有m个块,每个块内有Si个点,块内点彼此到达费用为wi,两个人分别位于1和n号块,两者同时出发问最短时间遇到是多少?在哪些地方可以遇到? Σ ...

  7. AcWing - 175 电路维修(思维建边+最短路)

    题目链接:点击查看 题目大意:我们要从左上角走到右下角,只能斜着走,问最少翻转道路的次数 题目分析:很直白的一个中文题,也没有多少坑,主要是思路问题,这里先说思路,我们可以将给出的道路建边,建成一个无 ...

  8. HDOJ 2112 HDU Today (最短路 Dijkstra SPFA)

    HDU Today Time Limit: 15000/5000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Total ...

  9. 男生和女生(思维建图,最大独立集问题)

    男生和女生(思维建图,最大独立集问题) 问题描述 在大学二年级,一些人开始了同学之间罗曼蒂克关系的研究.有"罗曼蒂克"关系是针对男生和女生之间的关系而言的.研究的原因是找到满足以下 ...

最新文章

  1. 潍坊科技学院计算机学院刘君,2019年山东省高校大学生计算机科技创新大会暨第十一届山东省大学生科技节计算机学会六项赛事研讨会在潍坊科技学院举行...
  2. 创建,修改Table格式
  3. 对pca降维后的手写体数字图片数据分类_python机器学习API介绍13: 数据降维及主成分分析...
  4. 使用log4j2打印mybatis的sql执行日志
  5. python字符串填充_填充函数(Python)字符串.zfi
  6. 为Visual Studio 2010增加ExtJs智能提示
  7. python单元测试mock_Python单元测试的Mock是怎么回事
  8. 如何获取 WebAssembly 代码
  9. DWM1000 收发RXLED TXLED控制代码修改
  10. Deep Learning for Content-Based Image Retrival:A Comprehensive Study 论文笔记
  11. php中lpush(),LPUSH命令_视频讲解_用法示例-redis编程词典-php中文网
  12. Chinese NER Using Lattice LSTM 论文解读
  13. English——slang about body
  14. Android Studio 基础控件飘红 处理办法
  15. 计算机专业 英语复试专业问题准备(1)
  16. 什么是框架?框架和库有什么区别?
  17. Tensorflow2.x: TensorFlow Addons介绍
  18. Excel软件的使用指南
  19. 打造Windows10堡垒主机(V1.0)
  20. B2型水面线计算(含python代码)

热门文章

  1. mysql有3个共同好友_共同好友mysql
  2. linux生成表格文件大小,如何为linux中的文件夹生成清单(文件列表及其大小和数量)...
  3. Redis AOF带来的问题
  4. elastic-job配置类
  5. MySQL sql99语法—自连接
  6. Bean标签范围配置
  7. maven工程的标准目录结构
  8. HashSet集合介绍
  9. php windows 操作文件,Windows开启审核功能来记录文件删除操作的详解
  10. Cortex‐M3-指令集