题目链接<http://poj.org/problem?id=1797>
题意:
和poj2253题目一样,只不过相反。这题求的是从1点到n点路径中最小的权值最大可以为多少。
题解:
Dijstra变形:松弛操作:dis[j]=max(dis[j],min(G[p][j],dis[p]))
#include <iostream>
#include <cstdio>
#include <algorithm>
#include <queue>
#include <vector>
#include <math.h>
#include <string.h>
#include <string>
#include <map>
using namespace std;
typedef long long LL;
const int INF=(int)1e9;
int n,m,G[1005][1005],dis[1005],vis[1005];
void dij(int x){
memset(dis,0,sizeof(dis));
memset(vis,0,sizeof(vis));
vis[x]=1;
for(int i=1;i<=n;i++)
dis[i]=G[1][i];
for(int i=2;i<=n;i++){
int maxn=-1,p=0;
for(int j=1;j<=n;j++){
if(!vis[j]&&maxn<dis[j])
maxn=dis[j],p=j;
}
vis[p]=1;
for(int j=1;j<=n;j++){
if(!vis[j])
dis[j]=max(dis[j],min(G[p][j],dis[p]));
}
}
}
int main(){
int T;
cin>>T;
for(int t=1;t<=T;t++){
cin>>n>>m;
memset(G,0,sizeof(G));
int u,v,w;
for(int i=1;i<=m;i++){
cin>>u>>v>>w;
G[u][v]=G[v][u]=w;
}
dij(1);
printf("Scenario #%d:\n",t);
printf("%d\n\n",dis[n]);
}
}
二、prim变形。
生成最大生成树,遇到n点,返回最小值。
#include <iostream>
#include <cstdio>
#include <algorithm>
#include <queue>
#include <vector>
#include <math.h>
#include <string.h>
#include <string>
#include <map>
using namespace std;
typedef long long LL;
const int INF=(int)1e9;
int n,m,G[1005][1005],high[1005],vis[1005];
int prim(int x){
int ret=INF;
memset(high,0,sizeof(high));
memset(vis,0,sizeof(vis));
vis[x]=1;
for(int i=1;i<=n;i++)
high[i]=G[1][i];
for(int i=2;i<=n;i++){
int maxn=-1,p=0;
for(int j=1;j<=n;j++){
if(!vis[j]&&maxn<high[j])
maxn=high[j],p=j;
}
vis[p]=1;ret=min(maxn,ret);
if(p==n) return ret;
for(int j=1;j<=n;j++){
if(!vis[j])
high[j]=max(high[j],G[p][j]);
}
}
}
int main(){
int T;
cin>>T;
for(int t=1;t<=T;t++){
cin>>n>>m;
memset(G,0,sizeof(G));
int u,v,w;
for(int i=1;i<=m;i++){
cin>>u>>v>>w;
G[u][v]=G[v][u]=w;
}
printf("Scenario #%d:\n",t);
printf("%d\n\n",prim(1));
}
}