题目描述:
在图中找一条最小权值最大的行遍所有点的路
思路分析:
每一步都走权值最大点,注意松弛操作
AC
#include <stdlib.h>
#include <stdio.h>
#include <iostream>
#include <queue>
#include <stack>
#include <algorithm>
#include <string.h>
#include <math.h>
#define INF 0x3f3f3f3f
using namespace std;
int t;
int n,m;
int g[1010][1010];
int mark[1010];
int dis[1010];
int main(){
scanf("%d",&t);
for(int k=1;k<=t;k++){
int minn=INF;
memset(mark,0,sizeof(mark));
memset(g,0,sizeof(g));
memset(dis,0,sizeof(dis));
scanf("%d%d",&n,&m);
while(m--){
int a,b,c;
scanf("%d%d%d",&a,&b,&c);
g[a][b]=g[b][a]=c;
}
for(int i=2;i<=n;i++)
dis[i]=g[1][i];
mark[1]=1; //跳过1点
for(int i=1;i<n;i++){
int p=-1,index;
for(int j=1;j<=n;j++){
if(!mark[j]&&dis[j]>p){
p=dis[j];
index=j;
}
}
// printf("%d %d*\n",index,p);
mark[index]=1;
for(int j=1;j<=n;j++){
if(!mark[j]&&dis[j]<min(p,g[index][j])){
dis[j]=min(p,g[index][j]);
}
}
}
printf("Scenario #%d:\n%d\n\n",k,dis[n]);
}
}
错误代码:
问题出在注释处,这道题每一步都要找权值最大的点,所以说当确定第i步走到k点时,后续松弛操作的点的承载量就必须按照v0->....->k->后续点 的顺序,不能另辟蹊径
#include <stdlib.h>
#include <stdio.h>
#include <iostream>
#include <queue>
#include <stack>
#include <algorithm>
#include <string.h>
#include <math.h>
#define INF 0x3f3f3f3f
using namespace std;
int t;
int n,m;
int g[1010][1010];
int mark[1010];
int dis[1010];
int main(){
scanf("%d",&t);
for(int k=1;k<=t;k++){
int minn=INF;
memset(mark,0,sizeof(mark));
memset(g,0,sizeof(g));
memset(dis,-1,sizeof(dis));
scanf("%d%d",&n,&m);
while(m--){
int a,b,c;
scanf("%d%d%d",&a,&b,&c);
g[a][b]=g[b][a]=c;
}
dis[1]=INF;
for(int i=0;i<=n;i++){
int p=-1,index;
for(int j=1;j<=n;j++){
if(!mark[j]&&dis[j]>p){
p=dis[j];
index=j;
}
}
if(p==-1)break;
mark[index]=1;
for(int j=1;j<=n;j++){
if(!mark[j]){
if(dis[j]!=-1)
dis[j]=max(dis[j],min(dis[index],g[index][j])); //
else dis[j]=min(g[index][j],dis[index]);
}
}
}
for(int i=2;i<=n;i++)
if(dis[i]<minn)minn=dis[i];
printf("Scenario #%d:\n%d\n\n",k,minn==INF?0:minn);
}
}
错误代码:WA
#include <stdlib.h>
#include <stdio.h>
#include <iostream>
#include <queue>
#include <stack>
#include <algorithm>
#include <string.h>
#include <math.h>
#define INF 0x3f3f3f3f
using namespace std;
int t;
int n,m;
int g[1010][1010];
int mark[1010];
int dis[1010];
int main(){
scanf("%d",&t);
for(int k=1;k<=t;k++){
int minn=INF;
memset(mark,0,sizeof(mark));
memset(g,0,sizeof(g));
memset(dis,-1,sizeof(dis));
scanf("%d%d",&n,&m);
while(m--){
int a,b,c;
scanf("%d%d%d",&a,&b,&c);
g[a][b]=g[b][a]=c;
}
dis[1]=INF;
for(int i=0;i<=n;i++){
int p=-1,index;
for(int j=1;j<=n;j++){
if(!mark[j]&&dis[j]>p){
p=dis[j];
index=j;
}
}
if(p==-1)break;
if(p<minn)minn=p;
printf("%d*\n",minn);
mark[index]=1;
for(int j=1;j<=n;j++){
if(!mark[j]&&dis[j]<g[index][j])
dis[j]=g[index][j];
}
}
printf("Scenario #%d:\n%d\n\n",k,minn);
}
}
错误代码:TLE
#include <stdlib.h>
#include <stdio.h>
#include <iostream>
#include <queue>
#include <stack>
#include <algorithm>
#include <string.h>
#include <math.h>
#define INF 0x3f3f3f3f
using namespace std;
int t;
int n,m;
int g[1010][1010];
int mark[1010];
int dis[1010];
int main(){
scanf("%d",&t);
for(int k=1;k<=t;k++){
int minn=INF;
memset(mark,0,sizeof(mark));
memset(g,0,sizeof(g));
memset(dis,-1,sizeof(dis));
scanf("%d%d",&n,&m);
while(m--){
int a,b,c;
scanf("%d%d%d",&a,&b,&c);
g[a][b]=g[b][a]=c;
}
for(int k=1;k<=n;k++)
for(int i=1;i<=n;i++)
for(int j=1;j<=n;j++)
g[i][j]=max(g[i][j],min(g[i][k],g[k][j]));
for(int i=2;i<=n;i++)
minn=min(g[1][i],minn);
printf("Scenario #%d:\n%d\n\n",k,minn);
}
}