标签:
Domino Effect
Time Limit: 1000MS | Memory Limit: 65536K | |
Total Submissions: 10325 | Accepted: 2560 |
Description
Input
Output
Sample Input
2 1 1 2 27 3 3 1 2 5 1 3 5 2 3 5 0 0
Sample Output
System #1 The last domino falls after 27.0 seconds, at key domino 2. System #2 The last domino falls after 7.5 seconds, between key dominoes 2 and 3.
题目链接:http://poj.org/problem?id=1135
题目意思:输入n,m表示有n张关键牌,m表示n张牌之间有m行普通牌进行连接。n张牌的编号为1~n。每两张关键牌之间之多只有一行普通牌,并且图案是联通的。从第1张关键牌推到。最后倒下的如果是关键牌,输出看样例;如果是普通牌,输出看样例。
思路:因为起点固定,可以用求最短路径的Dijkastra算法(也可以用BFS搜索,如果时间更少就入列)。求出每张关键牌的倒下时间。两个关键牌i,j之间的普通牌完全倒下的时间为(edge[i][j]+time[i]+time[j])*1.0/2.0;如果时间不是等于time[i]或者time[j],时间就是这行普通牌最后倒下的时间;否则最后倒下的牌就是关键牌;
代码:
#include<iostream> #include<cstdio> using namespace std; #define INF 10000000 int n,m; int edge[510][510]; int sign[510],time[510]; void Init() { int i,j; int u,v,w; for(i=0; i<=n; i++) { time[i]=INF; sign[i]=0; for(j=0; j<=n; j++) edge[i][j]=INF; } for(i=0; i<m; i++) { scanf("%d%d%d",&u,&v,&w); edge[u][v]=edge[v][u]=w; } } void Dijkstra(int v0) { int i,j,t; time[v0]=0; for(i=0; i<n; i++) { sign[v0]=1; int Min=INF; for(j=1; j<=n; j++) { if(edge[v0][j]<INF&&time[v0]+edge[v0][j]<time[j]) time[j]=time[v0]+edge[v0][j]; if(sign[j]==0&&time[j]<Min) { Min=time[j]; t=j; } } v0=t; if(v0<=0&&v0>n) break; } } int main() { int i,j; int t=1; while(scanf("%d%d",&n,&m)&&!(n==0&&m==0)) { Init(); Dijkstra(1); float Max1=0; int flag=1; for(i=1; i<=n; i++) if(time[i]>Max1) { Max1=time[i]; flag=i; } float Max2=0; int a=1,b=1; for(i=1; i<=n; i++) { for(j=1; j<=n; j++) if(edge[i][j]<INF) { float ans=(edge[i][j]+time[i]+time[j])*1.0/2; if(ans>Max2) { Max2=ans; a=i; b=j; } } } cout<<"System #"<<t<<endl; if(Max2>Max1) printf("The last domino falls after %.1f seconds, between key dominoes %d and %d.\n\n",Max2,a,b); else printf("The last domino falls after %.1f seconds, at key domino %d.\n\n",Max1,flag); t++; } return 0; }
标签:
原文地址:http://www.cnblogs.com/GeekZRF/p/5418725.html