POJ-1797 Heavy Transportation

来源:互联网 发布:模拟人生4男性捏脸数据 编辑:程序博客网 时间:2024/05/18 16:37
题目链接:http://acm.hust.edu.cn/vjudge/contest/66569#problem/C
题目大意:给你一个N个点的无向图,让你找一条路径,使得路径上的最小边权最大。
解题思路:d[i]表示从1到i的最小边权 方程为 d[j]=max(d[j],min(d[i],G[i][j])); 用dijkstra维护转移即可。具体见代码。
代码:
#include<iostream>#include<cstdio>#include<cmath>#include<cstdlib>#include<algorithm>#include<cstring>using namespace std;const int maxn=1005;int G[maxn][maxn];int d[maxn];bool vis[maxn];int T,n,m;void dij(){memset(d,-1,sizeof d);memset(vis,0,sizeof vis);d[1]=0;for(int i=1;i<=n;i++){int temp=-1;int k;for(int j=1;j<=n;j++)if(!vis[j]&&temp<d[j]){k=j;temp=d[j];} vis[k]=1;if(k==1)for(int j=1;j<=n;j++) d[j]=G[k][j];else for(int j=1;j<=n;j++)if(!vis[j]&&d[j]<min(d[k],G[k][j])) d[j]=min(d[k],G[k][j]);}}int main(){scanf("%d",&T);for(int k=1;k<=T;k++){scanf("%d%d",&n,&m); for(int i=1;i<=n;i++)for(int j=1;j<=n;j++)G[i][j]=0; for(int i=1;i<=m;i++){int a,b,c;scanf("%d%d%d",&a,&b,&c);G[a][b]=G[b][a]=c; }dij();printf("Scenario #%d:\n",k);cout<<d[n]<<endl<<endl;} return 0;} 


0 0
原创粉丝点击