WA了多次的代码:
#include <stdio.h>
#include <algorithm>
using namespace std;
struct DIS{
int a,b;
int valu;
}dis[10005];
int cnt=0,bleg[105];
int cmp (const DIS &a,const DIS &b){
return a.valu < b.valu;
}
int find (int x){
int y=x;
while (y != bleg[y])
y = bleg[y];
while (x != bleg[x]){
int px = bleg[x];
bleg[x] = y;
x = px;
}
return y;
}
bool Union (int a,int b){
int pa=find(a),pb=find(b);
if (pa==pb)
return false;
else if (rand() & 1)
bleg[pa] = pb;
else
bleg[pb] = pa;
cnt++;
return true;
}
void init (int n){
for (int i=1;i<=n;i++) bleg[i] = i;
}
int main (){
int n;
while (~scanf ("%d",&n) && n){
int m,a,b;
cnt=0;
init (n);
for (int i=1;i<=n;i++)
for (int j=1;j<=n;j++){
scanf ("%d",&dis[i].valu);
dis[i].a=i,dis[i].b=j; //--------错误一:dis以i为下标,错误的以为dis的个数就是len=n*n;
}
scanf ("%d",&m);
for (int i=0;i<m;i++){
scanf ("%d%d",&a,&b);
Union (a,b);
}
int len=n*n,sum=0;
sort (dis+1,dis+len+1,cmp);
for (int i=1;i<=len;i++){
if (cnt == n-1) break;
if (Union (dis[i].a,dis[i].b)){
cnt++; // ----错误二:cnt已经在Union中自增了,在此处又重复自增一次。
sum += dis[i].valu;
}
}
printf ("%d\n",sum);
}
return 0;
}
改正以上错误的AC代码:
#include <stdio.h>
#include <algorithm>
#include <cstdlib>
using namespace std;
struct DIS{
int a,b;
int valu;
}dis[10005];
int cnt=0,bleg[105];
int cmp (const DIS &a,const DIS &b){
return a.valu < b.valu;
}
int find (int x){
int y=x;
while (y != bleg[y])
y = bleg[y];
while (x != bleg[x]){
int px = bleg[x];
bleg[x] = y;
x = px;
}
return y;
}
bool Union (int a,int b){
int pa=find(a),pb=find(b);
if (pa==pb)
return false;
else if (rand() & 1)
bleg[pa] = pb;
else
bleg[pb] = pa;
cnt++;
return true;
}
void init (int n){
for (int i=1;i<=n;i++) bleg[i] = i;
}
int main (){
#ifndef ONLINE_JUDGE
freopen ("in.txt","r",stdin);
#endif
int n;
while (~scanf ("%d",&n) && n){
int m,a,b,k=0;
cnt=0;
init (n);
for (int i=1;i<=n;i++)
for (int j=1;j<=n;j++){
scanf ("%d",&dis[k].valu);
dis[k].a=i,dis[k++].b=j;
}
scanf ("%d",&m);
for (int i=0;i<m;i++){
scanf ("%d%d",&a,&b);
Union (a,b);
}
int sum=0;
sort (dis,dis+k,cmp);
// for (int i=0;i<k;i++){ //----对排序后结果的输入发现了错误所在。
// if (dis[i].valu==0) continue;
// printf ("%d\n",dis[i].valu);}
for (int i=0;i<k;i++){
if (cnt == n-1) break;
if (dis[i].valu==0) continue;
if (Union (dis[i].a,dis[i].b)) //如果a b成功加入到一个集合
sum += dis[i].valu;
}
// printf ("cnt = %d\n",cnt);
printf ("%d\n",sum);
}
return 0;
}