CODEVS 1961 躲避大龙(CODEVS200题纪念)
2016-10-19 19:23
211 查看
题目描述 Description
你早上起来,慢悠悠地来到学校门口,发现已经是八点整了!(这句话里有一个比较重要的条件)
学校共有N个地点,编号为1~N,其中1号为学校门口(也就是你现在所处的位置),2号为你的教室(也就是你的目的地)。这些地点之间有M条双向道路,对于第i条道路,为了不引起值周队老师的怀疑,你通过它的时间须恰好为Ti秒。这个数可能为负数,意义为时间倒流。
不过,即使没有引起怀疑,值周队也布下了最后一道防线:大龙会在教室处不定期出现。当然,你也了解大龙的习性:当前时间的秒数越小,大龙出现的概率就越低,例如:8:13:06这一时刻的秒数是06,就要比8:12:57这个时刻更加安全。
现在的问题是,在不引起怀疑的前提下,最安全的到达时刻的秒数是多少。如果学校门口到教室没有路(-_-||),请输出60。
注意,你可以选择在途中的任何时候经过教室,而不结束“旅程”,具体见样例。
输入描述 Input Description
第一行为两个整数,N和M,意义在上面已经说过了。
第2行~第M+1行,每行代表一条道路。第i+1行代表第i条道路,这一行有3个整数,Ai,Bi,Ti,表示Ai号地点与Bi号地点有一条双向道路,通过它的时间必须为Ti秒。
输出描述 Output Description
只有一行,为最安全的到达时刻的秒数。
披着最短路外衣的BFS= =,我该说什么呢。
好,这是一道BFS,我们记录状态的时候,开一个vis[][],第一维代表点,第二位代表到这个点的时候是几秒。
你早上起来,慢悠悠地来到学校门口,发现已经是八点整了!(这句话里有一个比较重要的条件)
学校共有N个地点,编号为1~N,其中1号为学校门口(也就是你现在所处的位置),2号为你的教室(也就是你的目的地)。这些地点之间有M条双向道路,对于第i条道路,为了不引起值周队老师的怀疑,你通过它的时间须恰好为Ti秒。这个数可能为负数,意义为时间倒流。
不过,即使没有引起怀疑,值周队也布下了最后一道防线:大龙会在教室处不定期出现。当然,你也了解大龙的习性:当前时间的秒数越小,大龙出现的概率就越低,例如:8:13:06这一时刻的秒数是06,就要比8:12:57这个时刻更加安全。
现在的问题是,在不引起怀疑的前提下,最安全的到达时刻的秒数是多少。如果学校门口到教室没有路(-_-||),请输出60。
注意,你可以选择在途中的任何时候经过教室,而不结束“旅程”,具体见样例。
输入描述 Input Description
第一行为两个整数,N和M,意义在上面已经说过了。
第2行~第M+1行,每行代表一条道路。第i+1行代表第i条道路,这一行有3个整数,Ai,Bi,Ti,表示Ai号地点与Bi号地点有一条双向道路,通过它的时间必须为Ti秒。
输出描述 Output Description
只有一行,为最安全的到达时刻的秒数。
披着最短路外衣的BFS= =,我该说什么呢。
好,这是一道BFS,我们记录状态的时候,开一个vis[][],第一维代表点,第二位代表到这个点的时候是几秒。
#include<cstdio> #include<queue> using namespace std; int n,m; const int inf=0x7fffffff; const int maxn=100000; struct Edge { int to; int d; int next; }edge[maxn]; int tot; int head[maxn]; int dist[maxn]; bool vis[maxn][70]; void add(int f,int t,int d) { edge[++tot].to=t; edge[tot].d=d; edge[tot].next=head[f]; head[f]=tot; } struct meico { int x; int d; }; queue<meico>q; void spfa() { dist[1]=0; vis[1][0]=1; q.push((meico){1,0}); while(!q.empty()) { meico x=q.front(); q.pop(); for(int i=head[x.x];i;i=edge[i].next) { Edge e=edge[i]; int dis=(e.d+x.d)%60; while(dis<0) dis+=60; if(!vis[e.to][dis]) { vis[e.to][dis]=1; q.push((meico){e.to,dis}); } } } } int main() { scanf("%d%d",&n,&m); for(int i=1;i<=n;i++) dist[i]=inf; for(int i=1;i<=m;i++) { int a,b,c; scanf("%d%d%d",&a,&b,&c); add(a,b,c); add(b,a,c); } spfa(); int ans=2333; for(int i=0;i<=60;i++) { if(vis[2][i]) { ans=i; break; } } if(ans==2333) puts("60"); else { if(ans<10) printf("0%d",ans); else printf("%d",ans); } return 0; }
相关文章推荐
- [Codevs] 1961 躲避大龙
- codevs 1961 躲避大龙(spfa)
- codevs1961 躲避大龙
- codevs 1961 躲避大龙 解题报告 SPFA
- Codevs 1961 躲避大龙
- CodeVS1961躲避大龙 题解【图论】【SPFA】【搜索】
- codevs 1961 躲避大龙 题解报告
- [codevs1961]躲避大龙
- Codevs1961 躲避大龙
- 躲避大龙(codevs 1961)
- codevs 1961 躲避大龙 bfs
- 【codevs 1961】 躲避大龙
- 1961 躲避大龙
- CodeVS2488 绿豆蛙的归宿(第200篇文章纪念)
- Codevs 1961 躲避大龙 spfa
- 【codevs 1961】躲避大龙
- Codevs 1961 躲避大龙
- [codevs 1961]躲避大龙(dfs)
- 1961 躲避大龙(dfs)
- codevs 1961 躲避大龙