和POJ 2253 恰好相反。这个是求1-n的路中最小的边。也可以用 迪杰斯特拉 弗洛伊德 和spfa 三种方法写。注意一下 初始化将dist初始化为极大值,其他没什么了。贴个spfa的
#include<stdio.h> #include<string.h> #include<cstring> #include<string> #include<math.h> #include<queue> #include<algorithm> #include<iostream> #include<stdlib.h> #include<cmath> #define INF 0x3f3f3f3f #define MAX 1000005 using namespace std; struct node { int u,v,next,w; }Map[MAX]; int n,m,vis[MAX],k,a[MAX],dist[MAX]; void Init() { memset(vis,0,sizeof(vis)); for(int i=0;i<MAX;i++) { a[i]=-1; dist[i]=0; } } void Add(int u,int v,int w) { Map[k].u=u; Map[k].v=v; Map[k].w=w; Map[k].next=a[u]; a[u]=k++; } void spfa() { queue<int>Q; int start=1,i; dist[1]=INF; vis[1]=1; Q.push(start); while(!Q.empty()) { start=Q.front(); Q.pop(); vis[start]=0; for(i=a[start];i!=-1;i=Map[i].next) { int v=Map[i].v; if(dist[v] < dist[start] && dist[v] < Map[i].w) { dist[v]=min(dist[start],Map[i].w); if(!vis[v]) { vis[v]=1; Q.push(v); } } } } } int main() { int i,cas=1,x,y,w,T; scanf("%d",&T); while(T--) { Init(); scanf("%d%d",&n,&m); for(i=1;i<=m;i++) { scanf("%d%d%d",&x,&y,&w); Add(x,y,w); Add(y,x,w); } spfa(); printf("Scenario #%d: ",cas++); printf("%d ",dist[n]); } return 0; }