思路:题目意思很简单,n个顶点,m条路,每条路上都有最大载重限制,问1->n最大载重量。其实就是一最短路的变形,定义weight[i]表示源点到顶点i的最大载重量,初始化为0,之后不断去更新就行了。
/*题意:求最小生成树的最大值,可以用spfa算法过*/ #include<stdio.h> #include<string.h> #include<queue> #include<iostream> #include<algorithm> using namespace std; const int inf=1<<30; const int maxn=1005; const int maxm=maxn*maxn; int data[maxm],vis[maxn],head[maxm],next[maxm],cost[maxm],dist[maxm]; int n,m,e; queue<int>q; void addage(int u,int v,int c)//邻接矩阵 { data[e]=v; cost[e]=c; next[e]=head[u]; head[u]=e++; } void spfa(int s) { for(int i=0; i<=n; i++) { dist[i]=0; vis[i]=0; } dist[s]=inf; q.push(s); while(!q.empty()) { int k=q.front(); q.pop(); vis[k]=0; for(int i=head[k]; i!=-1; i=next[i]) { if(dist[data[i]]<min(dist[k],cost[i]))//求最小生成树中的最大值 { dist[data[i]]=min(dist[k],cost[i]); if(!vis[data[i]]) { q.push(data[i]); vis[data[i]]=1; } } } } return; } int main() { int t; scanf("%d",&t); int l=1; while(t--) { e=0; memset(head,-1,sizeof(head)); scanf("%d%d",&n,&m); int u,v,c; while(m--) { scanf("%d%d%d",&u,&v,&c); addage(u,v,c); addage(v,u,c); } spfa(1); printf("Scenario #%d:\n",l++); printf("%d\n\n",dist[n]); } return 0; }
/*dij算法也可以过*/ #include<stdio.h> #include<string.h> #include<algorithm> using namespace std; #define N 1005 int w[N][N],vis[N],d[N]; int n,m; void dij(int s) { for(int i=1;i<=n;i++) { d[i]=w[s][i]; } d[s]=0; vis[s]=1; for(int i=1;i<=n;i++) { int now=-1,k; for(int j=1;j<=n;j++) { if(!vis[j]&&now<d[j]) { now=d[j]; k=j; } } if(now==-1) { break; } vis[k]=1; for(int j=1;j<=n;j++) { if(!vis[j]&&d[j]<min(d[k],w[k][j])) { d[j]=min(d[k],w[k][j]); } } } } int main() { int t; scanf("%d",&t); int l=1; while(t--) { memset(vis,0,sizeof(vis)); memset(w,0,sizeof(w)); scanf("%d%d",&n,&m); int u,v,c; while(m--) { scanf("%d%d%d",&u,&v,&c); w[u][v]=w[v][u]=c; } dij(1); printf("Scenario #%d:\n",l++); printf("%d\n\n",d[n]); } return 0; }