HDU 5521 Meeting (最短路 + 拆点)
来源:互联网 发布:怎么用spss将数据分组 编辑:程序博客网 时间:2024/06/12 00:53
题目点我点我点我
题目大意:有N个点,给定M个集合,集合Si里面的点两两之间的距离都为Ti,集合里面的所有点数之和<=1e6。两个人分别从1和n出发,要求相遇的最短距离,并输出相遇的点(可能多个)。
解题思路:首先无疑是最短路,然后因为同一个点可能属于两个或多个集合,故需要拆点。除了n个点外,每一个集合建一个新的点与集合中的点相连,集合中的点要到集合中的另一个点要先经过新建的点,所以走的路变成了2倍,分别从1和n各走一遍最短路,最后答案除以2即可。
/* ***********************************************┆ ┏┓ ┏┓ ┆┆┏┛┻━━━┛┻┓ ┆┆┃ ┃ ┆┆┃ ━ ┃ ┆┆┃ ┳┛ ┗┳ ┃ ┆┆┃ ┃ ┆┆┃ ┻ ┃ ┆┆┗━┓ 马 ┏━┛ ┆┆ ┃ 勒 ┃ ┆ ┆ ┃ 戈 ┗━━━┓ ┆┆ ┃ 壁 ┣┓┆┆ ┃ 的草泥马 ┏┛┆┆ ┗┓┓┏━┳┓┏┛ ┆┆ ┃┫┫ ┃┫┫ ┆┆ ┗┻┛ ┗┻┛ ┆************************************************ */#include <stdio.h>#include <string.h>#include <iostream>#include <algorithm>#include <vector>#include <queue>#include <stack>#include <set>#include <map>#include <string>#include <math.h>#include <stdlib.h>#include <bitset>using namespace std;#define rep(i,a,b) for (int i=(a),_ed=(b);i<=_ed;i++)#define per(i,a,b) for (int i=(b),_ed=(a);i>=_ed;i--)#define pb push_back#define mp make_pairconst int inf_int = 2e9;const long long inf_ll = 2e18;#define inf_add 0x3f3f3f3f#define mod 1000000007#define LL long long#define ULL unsigned long long#define MS0(X) memset((X), 0, sizeof((X)))#define SelfType intSelfType Gcd(SelfType p,SelfType q){return q==0?p:Gcd(q,p%q);}SelfType Pow(SelfType p,SelfType q){SelfType ans=1;while(q){if(q&1)ans=ans*p;p=p*p;q>>=1;}return ans;}#define Sd(X) int (X); scanf("%d", &X)#define Sdd(X, Y) int X, Y; scanf("%d%d", &X, &Y)#define Sddd(X, Y, Z) int X, Y, Z; scanf("%d%d%d", &X, &Y, &Z)#define reunique(v) v.resize(std::unique(v.begin(), v.end()) - v.begin())#define all(a) a.begin(), a.end()typedef pair<int, int> pii;typedef pair<long long, long long> pll;typedef vector<int> vi;typedef vector<long long> vll;inline int read(){int ra,fh;char rx;rx=getchar(),ra=0,fh=1;while((rx<'0'||rx>'9')&&rx!='-')rx=getchar();if(rx=='-')fh=-1,rx=getchar();while(rx>='0'&&rx<='9')ra*=10,ra+=rx-48,rx=getchar();return ra*fh;}//#pragma comment(linker, "/STACK:102400000,102400000")const int N = 2e6 + 5;struct Edge{ int to,nx; LL w;}edge[N*2];int cnt,head[N];void addedge(int u,int v,LL w){ edge[cnt] = {v,head[u],w}; head[u] = cnt++;}struct node{ int p; LL d; bool operator < (const node &a) const { return d>a.d; }};LL da[N],db[N];int vis[N],n,m,z;void dijkstra(int s,LL d[]){ priority_queue<node>q; for(int i=0;i<=z;i++) { vis[i] = 0; d[i] = inf_ll; } d[s] = 0; q.push(node{s,d[s]}); while(!q.empty()) { node t = q.top(); q.pop(); int u = t.p; if(vis[u])continue; vis[u] = 1; for(int i=head[u];i;i=edge[i].nx) { int v = edge[i].to; LL w = edge[i].w; if(d[v]>d[u]+w) { d[v] = d[u] + w; q.push(node{v,d[v]}); } } }}int main(){ //freopen("in.txt","r",stdin); //freopen("out.txt","w",stdout); ios::sync_with_stdio(0); cin.tie(0); int t; t = read(); int cas = 1; while(t--) { n = read(), m =read(); MS0(head); cnt = 1; z = n; for(int i=1;i<=m;i++) { z++; LL d; int k,p; scanf("%I64d%d",&d,&k); for(int j=1;j<=k;j++) { scanf("%d",&p); addedge(z,p,d); addedge(p,z,d); } } dijkstra(1,da); dijkstra(n,db); LL ans = inf_ll; for(int i=1;i<=n;i++) { ans = min(ans,max(da[i],db[i])); } if(ans==inf_ll)printf("Case #%d: Evil John\n",cas++); else { printf("Case #%d: %I64d\n",cas++,ans/2); int flag = 0; for(int i=1;i<=n;i++) { if(ans==max(da[i],db[i])) { if(flag)printf(" "); flag = 1; printf("%d",i); } } printf("\n"); } } return 0;}
0 0
- HDU 5521 Meeting 【拆点+最短路】
- HDU 5521 Meeting (最短路 + 拆点)
- HDU 5521 Meeting 抽象点+最短路
- HDU 5521 Meeting (最短路)
- hdu 5521 Meeting(最短路)
- Hdu 5521 Meeting(建图+最短路)
- HDU 5521:Meeting(最短路)
- HDU 5521-Meeting(最短路)
- HDU 5521 Meeting 最短路
- HDU 5521 Meeting【最短路】
- HDU 5521 Meeting(最短路)
- HDU 5521 Meeting(最短路)
- 【最短路】hdu 5521 Meeting
- 最短路(建图)—— Meeting (HDU 5521)
- HDU 5521 Meeting(虚拟节点+最短路)
- HDU 5521 Meeting(巧妙地构图的最短路)
- hdu-5521-Meeting- 最短路-增点建图
- HDU 5521 Meeting 化简边的最短路
- zynq-7000学习笔记(十)——Linux下通过UIO配置FAST corner寄存器
- Python(x,y)中没有包括的算法包
- Cornerstone的Merge方法
- Unity5网络模块UNet介绍
- Android中关于lambda的使用详解
- HDU 5521 Meeting (最短路 + 拆点)
- 微信开源PhxSQL:高可用、强一致的MySQL集群
- window 10 专业版 永久激活
- UILable 详解
- maven打可运行jar,包含依赖jar,且打成zip包
- eclipse 中PermGen space及参数设置
- crawler4j 爬虫网页数据并保存到数据库中
- The operation couldn't be completed (LaunchServicesError error 0.)
- 提供一个C#获取本机IP地址的方法,不会出现获取的ip地址是IPV6或不能用的