题不难,题目很难...
读了好几遍还是给理解错了,纠结!
就是求最小生成树里最大的边权值,拿过来poj1287一改就交,果断WA..仔细一看,权值的更新给搞错了,这是要让我郁闷到极点啊!
#include<cstdio>
#define Max(a, b) a>b?a:b
#define Min(a, b) a>b?b:a
using namespace std ;
int map[505][505] ;
int dis[505] ;
int n ;
int prim(){
int i, j, ans = 0, x = 1 ;
for(j=1; j<=n; j++)
dis[j] = map[x][j] ;
for(i=2; i<=n; i++){
int min = 65537 ;
for(j=1; j<=n; j++){
if(min>dis[j]&&dis[j]!=0){
min = dis[j] ;
x = j ;
}
}
dis[j] = 0 ;
ans = Max(ans, min) ;
for(j=1; j<=n; j++)
dis[j] = Min(dis[j], map[x][j]) ;
}
return ans ;
}
int main(){
int t, i, j, ans ;
scanf("%d", &t) ;
while(t--){
scanf("%d", &n) ;
for(i=1; i<=n; i++)
for(j=1; j<=n; j++)
scanf("%d", &map[i][j]) ;
ans = prim() ;
printf("%d\n", ans) ;
}
return 0 ;
#define Max(a, b) a>b?a:b
#define Min(a, b) a>b?b:a
using namespace std ;
int map[505][505] ;
int dis[505] ;
int n ;
int prim(){
int i, j, ans = 0, x = 1 ;
for(j=1; j<=n; j++)
dis[j] = map[x][j] ;
for(i=2; i<=n; i++){
int min = 65537 ;
for(j=1; j<=n; j++){
if(min>dis[j]&&dis[j]!=0){
min = dis[j] ;
x = j ;
}
}
dis[j] = 0 ;
ans = Max(ans, min) ;
for(j=1; j<=n; j++)
dis[j] = Min(dis[j], map[x][j]) ;
}
return ans ;
}
int main(){
int t, i, j, ans ;
scanf("%d", &t) ;
while(t--){
scanf("%d", &n) ;
for(i=1; i<=n; i++)
for(j=1; j<=n; j++)
scanf("%d", &map[i][j]) ;
ans = prim() ;
printf("%d\n", ans) ;
}
return 0 ;
}