1. 程式人生 > >poj1135Domino Effect——最短路

poj1135Domino Effect——最短路

return min nbsp lan () ble using class 嘗試

題目:http://poj.org/problem?id=1135

先在圖中跑一遍最短路,最後倒的牌可能是dis值最大的點,也可能是在dis值最大的點所連的邊上,嘗試一下即可;

坑:n=1的時候輸出點1。

代碼如下:

#include<iostream>
#include<cstdio>
#include<cstring>
#include<queue>
using namespace std;
queue<int>q;
int n,m,head[505],ct,dis[505],t;
double ans;
bool in[505];
struct
N{ int to,next,w; N(int t=0,int n=0,int o=0):to(t),next(n),w(o) {} }edge[250005]; int main() { while(scanf("%d%d",&n,&m)==2) { t++; if(!n&&!m)return 0; ct=0; memset(head,0,sizeof head); memset(dis,2,sizeof dis); memset(in,0,sizeof
in); for(int i=1;i<=m;i++) { int x,y,z; scanf("%d%d%d",&x,&y,&z); edge[++ct]=N(y,head[x],z);head[x]=ct; edge[++ct]=N(x,head[y],z);head[y]=ct; } while(q.size())q.pop(); dis[1]=0;q.push(1);in[1]=1;
while(q.size()) { int x=q.front();q.pop(); in[x]=0; for(int i=head[x];i;i=edge[i].next) { int u=edge[i].to; if(dis[x]+edge[i].w<dis[u]) { dis[u]=dis[x]+edge[i].w; if(!in[u])in[u]=1,q.push(u); } } } int k=0,dk=0;ans=0; for(int i=1;i<=n;i++) if(dis[i]>=ans)//>=以處理n=1的情況 { ans=dis[i]; k=i; } for(int i=head[k];i;i=edge[i].next) { int u=edge[i].to; if(dis[u]+edge[i].w>dis[k]&&ans<1.0*(edge[i].w-dis[k]+dis[u])/2+dis[k]) ans=1.0*(edge[i].w-dis[k]+dis[u])/2+dis[k],dk=u; } printf("System #%d \n",t); if(dk>k)swap(dk,k); if(ans==dis[k]) printf("The last domino falls after %.1lf seconds, at key domino %d.\n",ans,k); else printf("The last domino falls after %.1lf seconds, between key dominoes %d and %d.\n",ans,dk,k); printf("\n"); } return 0; }

poj1135Domino Effect——最短路