1. 程式人生 > >POJ--1797 Heavy Transportation (最短路)

POJ--1797 Heavy Transportation (最短路)

題目電波: POJ--1797 Heavy Transportation 

n點m條邊, 求1到n最短邊最大的路徑的最短邊長度 
改進dijikstra,dist[i]陣列儲存源點到i點的最短邊最大的路徑的最短邊長度

 

#include<iostream>
#include<cstring>
#include<algorithm>
#include<stdio.h>
using namespace std;
#define maxn 100010
#define inf 0x3f3f3f3f
struct
ac{ int x,y; ac(){} ac(int a,int b){ x=a,y=b; } }a[maxn]; struct wa{ int to,va,nex; }eg[maxn]; int dis[maxn],head[maxn]; bool fa[maxn]; int n,m,tot,len; void init(){ memset(head,-1,sizeof(head)); memset(eg,0,sizeof(eg)); memset(fa,0,sizeof(fa)); tot=0,len=0; }
void add_eg(int u,int v,int va){ eg[tot].to=v; eg[tot].va=va; eg[tot].nex=head[u]; head[u]=tot++; eg[tot].to=u; eg[tot].va=va; eg[tot].nex=head[v]; head[v]=tot++; } bool xxx(ac q,ac w){ if(q.x>w.x) return 1; return 0; } void add(int v){ if(v==1) return
; if(xxx(a[v],a[v/2])){ swap(a[v],a[v/2]); add(v/2); } } void updata(int v){ if(v*2>len) return ; if(v*2==len){ if(xxx(a[v*2],a[v])) swap(a[v],a[v*2]); return ; } if(xxx(a[v],a[v*2])&&xxx(a[v],a[v*2+1])) return ; if(xxx(a[v*2],a[v*2+1])){ swap(a[v*2],a[v]); updata(v*2); }else{ swap(a[v*2+1],a[v]); updata(v*2+1); } } void dijstra(){ memset(dis,0,sizeof(dis)); memset(fa,0,sizeof(fa)); dis[1]=inf; a[++len]=ac(inf,1); while(len){ ac x=a[1]; int u=x.y; swap(a[1],a[len--]),updata(1); if(fa[u]) continue; fa[u]=1; for(int j=head[u];j!=-1;j=eg[j].nex){ int v=eg[j].to; int va=eg[j].va; if(dis[v]<min(dis[u],va)){ dis[v]=min(dis[u],va); a[++len]=ac(dis[v],v); add(len); } } } } int main(){ int t,zz=1; cin>>t; while(t--){ cin>>n>>m; init(); for(int j=0;j<m;j++){ int u,v,va; scanf("%d%d%d",&u,&v,&va); add_eg(u,v,va); } dijstra(); printf("Scenario #%d:\n%d\n\n",zz++,dis[n]); } }