HDU 5521 15年亚洲赛现场题目 图论之最短路
2016-03-16 20:12
357 查看
点击打开链接
题意:两个人,一个人从1出发,令一个人从n出发,两个人可以停在某个点上,另一个人走过去,花费的时间是走的时间长的那个人用的时间,输出这样走的情况下,花费最小的时间。并输出哪个点符合这个最短时间,并输出,题目上题意很清晰。
思路:通过两次最短路找到最短时间,再遍历一次找到符合的点就行了,但题难在如何建图,如果暴力建图的话就会超时,此时我们可以自己模拟多个点,然后建图的时候将每个集合的点与这个模拟点连边,权值为0,无向图嘛,再连回来一条边,权值为花费,自己画图看看,用的真是巧妙
题意:两个人,一个人从1出发,令一个人从n出发,两个人可以停在某个点上,另一个人走过去,花费的时间是走的时间长的那个人用的时间,输出这样走的情况下,花费最小的时间。并输出哪个点符合这个最短时间,并输出,题目上题意很清晰。
思路:通过两次最短路找到最短时间,再遍历一次找到符合的点就行了,但题难在如何建图,如果暴力建图的话就会超时,此时我们可以自己模拟多个点,然后建图的时候将每个集合的点与这个模拟点连边,权值为0,无向图嘛,再连回来一条边,权值为花费,自己画图看看,用的真是巧妙
#include <queue> #include <vector> #include <limits.h> #include <stdio.h> #include <string.h> #include <iostream> #include <algorithm> #include <functional> using namespace std; typedef long long ll; const ll inf=0x3f3f3f3f; const int maxn=1000010; struct edge{ int to,cost; edge(int a,int b){to=a;cost=b;} }; typedef pair<int ,int > P; vector<edge>G[maxn*2]; ll ans1[maxn],ans2[maxn]; void dijkstra(int n,int start,ll ans[]){ priority_queue<P,vector<P>,greater<P> >que; fill(ans,ans+n+1,inf); ans[start]=0;que.push(P(0,start)); while(!que.empty()){ P p=que.top();que.pop(); int v=p.second; if(ans[v]<p.first) continue; for(unsigned int i=0;i<G[v].size();i++){ edge e=G[v][i]; if(ans[e.to]>ans[v]+e.cost){ ans[e.to]=ans[v]+e.cost; que.push(P(ans[e.to],e.to)); } } } } int main(){ int T,n,t=1,m; scanf("%d",&T); while(T--){ scanf("%d%d",&n,&m); int a,b,c; for(int i=0;i<2*maxn;i++) G[i].clear(); for(int i=1;i<=m;i++){ scanf("%d%d",&a,&b); while(b--){ scanf("%d",&c); G[c].push_back(edge(i+n,0)); G[i+n].push_back(edge(c,a)); } } dijkstra(n+m,1,ans1); dijkstra(n+m,n,ans2); ll ans=inf; int flag=0; for(int i=1;i<=n;i++){ ans=min(ans,max(ans1[i],ans2[i])); } if(ans==inf) printf("Case #%d: Evil John\n",t++); else{ printf("Case #%d: %I64d\n",t++,ans); for(int i=1;i<=n;i++){ if(max(ans1[i],ans2[i])==ans){ if(flag) printf(" ");flag=1; printf("%d",i); } } printf("\n"); } } return 0; }
相关文章推荐
- xml文件中空格输入
- 事实上,最糟的并不是李世石完败AlphaGo......
- 使用工具来提升Android开发效率
- session management
- (转) 解密H264、AAC硬件解码的关键扩展数据处理
- 作业2(2)
- MySQL 加锁处理分析
- 两个数组,大小都为n,两个数组里有相同的元素,设计一个算法,找到两个数组中相同的元素
- BroadcastReceiver 广播在应用内部注册
- CA dis4 notes
- 常用的 redis操作
- 致刚毕业迷茫的我们
- Material Design (二),TextInputLayout的使用
- 函数(-)
- 今年第一次面试
- Ubuntu系统使用光盘作为apt-get源
- Android APP安装后不在桌面显示图标的应用场景
- PSP(3.13——3.15)以及周记录
- lintcode:寻找旋转排序数组中的最小值 II
- reachability ios网络连接判断