【一百贴纪念!】[最短路][枚举]小萨的烦恼
2017-04-06 16:59
281 查看
题目描述
小萨将给出一张地图,它可以看做一个有N(N<=100)个结点的图。这张地图有N个公共汽车站,小萨只可以在这N个汽车站上公共汽车。有些车站之间存在一条双向通路,无论是公共汽车还是小萨,都只能走这些通路。若两个车站之间的距离为d,步行所需要的时间为2*d秒,坐公共汽车所需要的时间为d秒。小萨他们只有T秒的时间,他希望你求出他和他的MM出去约会后能否及时赶回来,若不能,则输出“You are day dreaming!”,否则输出他们所需要花费的最少时间。
注意:一张公共汽车车票可以使用两次(只可以搭乘同一辆公共汽车),即可以认为小萨去约会地点的时间和回来的时间相等。
Input
第一行有三个整数N、T、S
接下来是一个N*N的邻接矩阵。两两车站之间的距离不超过10^9。A[I,j]为0表示I和J车站不连通。
Output
若小萨他们不能在限定时间内赶回学校,那么输出“You are day dreaming!”(不包括引号)
否则,输出一个整数,为他们所需要花费的最少时间。
分析
首先吐槽一下这虐DOG的剧情。。。人工弹幕!
这题和最短路略有不同,不过都差不多。。。
坑点就是可以坐车= =
小心坐上黑车哦
关于坐车,有个效率不高(但我还是用了)
那就是枚举每个点坐车以后的时间然后疯狂dij
过程:
1、读入(废话)
2、然后枚举i<=n,j<=n并且车站间必须可通行
3、枚举过程中现将邻接矩阵枚举到的那条通路除以二(初始化时*2),然后dij,将dij得出的到每个点所需的最小的权值数组(d)中他们要到达的目的地那个值用mi来比较储存~~OK!
4、输出(二次废话)
小萨将给出一张地图,它可以看做一个有N(N<=100)个结点的图。这张地图有N个公共汽车站,小萨只可以在这N个汽车站上公共汽车。有些车站之间存在一条双向通路,无论是公共汽车还是小萨,都只能走这些通路。若两个车站之间的距离为d,步行所需要的时间为2*d秒,坐公共汽车所需要的时间为d秒。小萨他们只有T秒的时间,他希望你求出他和他的MM出去约会后能否及时赶回来,若不能,则输出“You are day dreaming!”,否则输出他们所需要花费的最少时间。
注意:一张公共汽车车票可以使用两次(只可以搭乘同一辆公共汽车),即可以认为小萨去约会地点的时间和回来的时间相等。
Input
第一行有三个整数N、T、S
接下来是一个N*N的邻接矩阵。两两车站之间的距离不超过10^9。A[I,j]为0表示I和J车站不连通。
Output
若小萨他们不能在限定时间内赶回学校,那么输出“You are day dreaming!”(不包括引号)
否则,输出一个整数,为他们所需要花费的最少时间。
分析
首先吐槽一下这虐DOG的剧情。。。人工弹幕!
这题和最短路略有不同,不过都差不多。。。
坑点就是可以坐车= =
小心坐上黑车哦
关于坐车,有个效率不高(但我还是用了)
那就是枚举每个点坐车以后的时间然后疯狂dij
过程:
1、读入(废话)
2、然后枚举i<=n,j<=n并且车站间必须可通行
3、枚举过程中现将邻接矩阵枚举到的那条通路除以二(初始化时*2),然后dij,将dij得出的到每个点所需的最小的权值数组(d)中他们要到达的目的地那个值用mi来比较储存~~OK!
4、输出(二次废话)
#include <iostream> #include <cstdio> #include <memory.h> using namespace std; int n,s,t,a[101][101],d[101],i,j,mi; bool b[101]; void dij() { int mi,i,j,u; memset(b,false,sizeof(b)); b[1]=1; for (i=1;i<=n;i++) d[i]=a[1][i]; for (j=1;j<=n-1;j++) { mi=2147483647; for (i=1;i<=n;i++) if (mi>d[i]&&!b[i]) { u=i; mi=d[i]; } b[u]=1; for (i=1;i<=n;i++) if (!b[i]&&a[u][i]!=2147483647&&d[u]+a[u][i]<d[i]) d[i]=d[u]+a[u][i]; } } int main() { scanf("%d%d%d",&n,&t,&s); for (i=1;i<=n;i++) for (j=1;j<=n;j++) { scanf("%d",&a[i][j]); a[i][j]=a[i][j]*2; if (a[i][j]==0) a[i][j]=2147483647; } mi=2147483647; for (i=1;i<=n;i++) for (j=1;j<=n;j++) if (a[i][j]!=2147483647) { a[i][j]=a[i][j]/2; dij(); if (mi>d[s]) mi=d[s]; a[i][j]=a[i][j]*2; } if (mi*2>t) printf("You are day dreaming!"); else printf("%d",mi*2); return 0; }
相关文章推荐
- ssl1624-小萨的烦恼【图论,最短路,Floyd】
- HDU 2363 Cycling(枚举+最短路)
- HDU 3768 Shopping 【最短路好题!!! + 离散化跑最短路 + 暴力枚举】
- 【hdu 2544】 最短路 (dijkstra 写的第一个最短路,也是dijkstra算法,纪念一下)
- HDU 2363 Cycling 枚举限制+最短路
- hdu3986Harry Potter and the Final Battle(最短路+枚举)
- POJ - 1062 昂贵的聘礼【最短路+枚举范围】
- hdu2363 枚举最短路
- SSL1624小萨的烦恼
- hdu 2363(最短路+枚举)
- 小萨的烦恼(代理解,待改进。。。)
- UVALive-7220 Dungeon Trap【最短路Bfs+思维枚举】好题~
- hdu1595(枚举+最短路,Dijkstra/SPFA)
- USACO-Section 3.3 Camelot (最短路&&枚举)
- poj 2253 Frogger 【枚举+并查集 or 最短路】
- cf667d 最短路建图 + 枚举 + 最优化剪枝
- 小萨的烦恼
- 小萨的烦恼
- HDU 1595 find the longest of the shortest (最短路+记录路径+枚举删边)
- POJ 3594 带限制的最短路 枚举+SPFA