poj 1135Domino Effect 最短路
阿新 • • 發佈:2019-01-24
一道最短路的題
題目大意:有一堆多米諾骨牌,有n個關鍵點,有m條路,對於m條路,輸入a,b,c表示從a推到b需要耗時間c。問從1號關鍵點開始推將所有多米諾骨牌都推倒需要耗費多長時間。
遍歷一遍dis【i】,找到最長路設定為maxn,記錄對應節點。
遍歷所有邊,在這條邊中有這樣三條資訊:dis【u】,dis【v】,w【u,v】。我們知道,分別代表:從節點1最快速度推到節點u的時間,從節點1最快速度推到節點v的時間,以及u,v之間的時間,
①如果有這樣的邊存在,那麼終點就不能能是一個節點,而是一條邊中的某個地方。
②如果有這樣的邊存在,那麼完成這一片區域的推倒時間為:(dis【u】+dis【v】+w【u,v】)/2 。
那麼我們就來列舉每一條邊,如果有這樣的邊存在了,那麼就計算一次(dis【u】+dis【v】+w【u,v】)/2 。維護其最大值記做maxn2,並且記錄這條邊的兩個節點。這時候如果maxn2>maxn。那麼就輸出其maxn2,和最大值對應的兩個節點。相反的,輸出maxn和那個單獨節點。
注意輸出格式
貼程式碼:
dijkstra無優化
#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<cmath>
#define maxn 505
#define inf 0x3f3f3f3f
using namespace std;
int n,m,cnt,head[maxn],t,num,dis[maxn];
double mx;
bool used[maxn];
struct Node{
int to,nxt;
int tim;
}edge[maxn*10];
void add(int x,int y,int z)
{
cnt++;
edge[cnt].to=y;
edge[cnt].nxt=head[x];
edge[cnt].tim=z;
head[x]=cnt;
}
void dijkstra(int s)
{
for(int i=1;i<=n;i++)
{
dis[i]=inf;
used[i]=0;
}
dis[s]=0;
for(int k=1;k<=n;k++)
{
int minn=inf,tar;
for(int i=1;i<=n;i++)
{
if(!used[i] && dis[i]<minn) minn=dis[i],tar=i;
}
used[tar]=1;
for(int i=head[tar];i;i=edge[i].nxt)
{
int v=edge[i].to;
if(!used[v] && dis[v]>dis[tar]+edge[i].tim)
{
dis[v]=dis[tar]+edge[i].tim;
}
}
}
}
int main()
{
while(~scanf("%d%d",&n,&m))
{
if(n==0 && m==0) break;
num++;
cnt=0;
memset(head,0,sizeof head);
for(int i=1;i<=m;i++)
{
int x,y,z;
scanf("%d%d%d",&x,&y,&z);
add(x,y,z); add(y,x,z);
}
printf("System #%d\n",num);
if(n==1)
{
printf("The last domino falls after 0.0 seconds, at key domino 1.\n\n");
continue;
}
dijkstra(1);
mx=t=0;
for(int i=1;i<=n;i++)
{
if(mx<dis[i]) mx=dis[i]*1.0,t=i;
}
int ta,tb;
double mx2=0;
for(int i=1;i<=n;i++)
{
for(int j=head[i];j;j=edge[j].nxt)
{
int v=edge[j].to;
double tmp=(dis[i]+dis[v]+edge[j].tim)/2.0;
if(tmp>mx2)
{
mx2=tmp;
ta=i,tb=v;
}
}
}
if(mx2>mx)
{
printf("The last domino falls after %.1lf seconds, between key dominoes %d and %d.\n\n",mx2,ta,tb);
}
else
printf("The last domino falls after %.1lf seconds, at key domino %d.\n\n",mx,t);
}
return 0;
}