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]); } }