POJ1135 Domino Effect(SPFA)

题目大概是,普通骨牌连接两张关键骨牌,一旦一张关键骨牌倒下与其相邻的普通骨牌也倒下,普通骨牌倒下与其相邻的骨牌也倒下。给出所有有普通骨牌相连的两个关键骨牌之间普通骨牌倒下所需时间,问1号关键骨牌开始倒下后最后一张骨牌倒下的时间和位置。

居然是最短路。。记dist[u]为起点骨牌1到关键骨牌u的最短时间,跑个单源最短路可得出。最后倒下的骨牌,有两种情况:

  1. 倒下的是关键骨牌u,那么倒下的时间就是dist[u]
  2. 倒下的是关键骨牌u和v之间某张普通骨牌,那么倒下的时间就是 (dist[u]+dist[v]+time(u,v))/2,因为:
    • dist[u]=dist[v]显然成立,不等于的情况不妨设dist[u]<dist[v];
    • 那么过了dist[u]的时间后,通往u点的骨牌到正好达u点,而通往v点的还需dist[v]-dist[u]的时间到达v;
    • 因而两边这时还有dist[v]-dist[u]+time(u,v)的时间长度,两边同时倒就还需要(dist[v]-dist[u]+time(u,v))/2的时间;
    • 所以总共需要(dist[v]-dist[u]+time(u,v))/2+dist[u],即(dist[v]+dist[u]+time(u,v))/2的时间。

这样分别搞搞这两种情况,就能找到答案。

 1 #include<cstdio>
 2 #include<cstring>
 3 #include<queue>
 4 #include<algorithm>
 5 using namespace std;
 6 #define MAXN 555
 7 #define MAXM 555*555*2
 8
 9 struct Edge{
10     int u,v,cost,next;
11 }edge[MAXM];
12 int head[MAXN],NE,n;
13 void addEdge(int a,int b,int c){
14     edge[NE].u=a; edge[NE].v=b; edge[NE].cost=c; edge[NE].next=head[a];
15     head[a]=NE++;
16 }
17
18 int d[MAXN];
19 void SPFA(int vs){
20     memset(d,127,sizeof(d));
21     d[vs]=0;
22     bool vis[MAXN]={0};
23     vis[vs]=1;
24     queue<int> que;
25     que.push(vs);
26     while(!que.empty()){
27         int u=que.front(); que.pop();
28         for(int i=head[u]; i!=-1; i=edge[i].next){
29             int v=edge[i].v;
30             if(d[v]>d[u]+edge[i].cost){
31                 d[v]=d[u]+edge[i].cost;
32                 if(!vis[v]){
33                     vis[v]=1;
34                     que.push(v);
35                 }
36             }
37         }
38         vis[u]=0;
39     }
40 }
41 int main(){
42     int m,a,b,c,cse=0;
43     while(~scanf("%d%d",&n,&m) && (n||m)){
44         NE=0;
45         memset(head,-1,sizeof(head));
46         while(m--){
47             scanf("%d%d%d",&a,&b,&c);
48             addEdge(a,b,c);
49             addEdge(b,a,c);
50         }
51         SPFA(1);
52         double res=-1;
53         bool flag=0;
54         for(int i=1; i<=n; ++i){
55             if(d[i]>res){
56                 res=d[i];
57                 a=i;
58             }
59         }
60         for(int i=0; i<NE; i+=2){
61             double tmp=(d[edge[i].u]+d[edge[i].v]+edge[i].cost)/2.0;
62             if(tmp>res){
63                 res=tmp;
64                 flag=1;
65                 a=edge[i].u; b=edge[i].v;
66                 if(a>b) swap(a,b);
67             }
68         }
69         printf("System #%d\n",++cse);
70         if(flag) printf("The last domino falls after %.1f seconds, between key dominoes %d and %d.\n\n",res,a,b);
71         else printf("The last domino falls after %.1f seconds, at key domino %d.\n\n",res,a);
72     }
73     return 0;
74 }
时间: 2024-12-08 11:58:07

POJ1135 Domino Effect(SPFA)的相关文章

POJ 1135 Domino Effect(最短路径)

题意有m排放置好的多米诺骨牌,每排的头尾骨牌称为“关键骨牌”,共有n个关键骨牌,每排多米诺倒下需要L秒,关键骨牌倒下的时间忽略不计.推倒关键骨牌1,求最后一个骨牌倒下的时间及位置.(若最后一个倒下的骨牌不是关键骨牌,则按升序输出这个骨牌所在的那一排的两端的关键骨牌) 样例输入2 11 2 273 31 2 51 3 52 3 50 0 样例输出System #1The last domino falls after 27.0 seconds, at key domino 2. System #2

unity3d 制造自己的水体water effect(二)

前篇:unity3d 制造自己的水体water effect(一) 曲面细分:Unity3d 使用DX11的曲面细分 PBR: 讲求基本算法 Unity3d 基于物理渲染Physically-Based Rendering之specular BRDF plus篇 Unity3d 基于物理渲染Physically-Based Rendering之实现 最终篇 Unity3d 基于物理渲染Physically-Based Rendering之最终篇 之前一直在用unity4.6写shader,终于下

HDU 2680Choose the best route (SPFA)

转载请注明出处:http://blog.csdn.net/u012860063 题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=2680 百度之星编程大赛--您报名了吗? 杭电ACM 2014暑期集训队--选拔安排~ Choose the best route Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Total Submis

poj 1860 Currency Exchange(SPFA)

题目链接:http://poj.org/problem?id=1860 Description Several currency exchange points are working in our city. Let us suppose that each point specializes in two particular currencies and performs exchange operations only with these currencies. There can b

模板C++ 03图论算法 1最短路之单源最短路(SPFA)

3.1最短路之单源最短路(SPFA) 松弛:常听人说松弛,一直不懂,后来明白其实就是更新某点到源点最短距离. 邻接表:表示与一个点联通的所有路. 如果从一个点沿着某条路径出发,又回到了自己,而且所经过的边上的权和小于0, 就说这条路是一个负权回路. 回归正题,SPFA是bellman-ford的一种改进算法,由1994年西安交通大学段凡丁提出.它无法处理带有负环的图,判断方法:如果某个点进入队列的次数超过N次则存在负环. SPFA的两种写法,bfs和dfs,bfs判别负环不稳定,相当于限深度搜索

unity3d 制造自己的水体water effect(一)

first,I wish you a happy new year, and study in spring festival's eve means you are hardworking,haha. I write in two languages. One passage write in Chineseone passage translate into English. My English is poor., If I write some thing wrong, welcome

hiho一下 第二十五周(SPFA)

时间限制:10000ms 单点时限:1000ms 内存限制:256MB 描述 万圣节的晚上,小Hi和小Ho在吃过晚饭之后,来到了一个巨大的鬼屋! 鬼屋中一共有N个地点,分别编号为1..N,这N个地点之间互相有一些道路连通,两个地点之间可能有多条道路连通,但是并不存在一条两端都是同一个地点的道路. 不过这个鬼屋虽然很大,但是其中的道路并不算多,所以小Hi还是希望能够知道从入口到出口的最短距离是多少? 提示:Super Programming Festival Algorithm. 输入 每个测试点

hihoCoder - 1093 - 最短路径&#183;三:SPFA算法 (SPFA)

#1093 : 最短路径·三:SPFA算法 时间限制:10000ms 单点时限:1000ms 内存限制:256MB 描述 万圣节的晚上,小Hi和小Ho在吃过晚饭之后,来到了一个巨大的鬼屋! 鬼屋中一共有N个地点,分别编号为1..N,这N个地点之间互相有一些道路连通,两个地点之间可能有多条道路连通,但是并不存在一条两端都是同一个地点的道路. 不过这个鬼屋虽然很大,但是其中的道路并不算多,所以小Hi还是希望能够知道从入口到出口的最短距离是多少? 提示:Super Programming Festiv

zoj 3103 Cliff Climbing(spfa )

Cliff Climbing Time Limit: 10 Seconds      Memory Limit: 32768 KB At 17:00, special agent Jack starts to escape from the enemy camp. There is a cliff in between the camp and the nearest safety zone. Jack has to climb the almost vertical cliff by step