这道题,有几个地方,来看看:
#include<stdio.h>
#include<stdlib.h>
typedef struct
{
int x,y;
int w;
}NODE;
typedef struct
{
int x1;
int x2;
}xx;
xx tt[1005];
NODE node[5005];
int a[105][105],k,pre[105],temp[1000];
int find(int x)
{
while(x!=pre[x])
x=pre[x];
return x;
}
int cmp(const void *a,const void *b)
{
if( ((NODE*)a)->w != ((NODE*)b)->w)
return ((NODE*)a)->w > ((NODE*)b)->w ? 1 : -1;
else
if( ((NODE*)a)->x != ((NODE*)b)->x)
return ((NODE*)a)->x > ((NODE*)b)->x ? 1 : -1;
else
return ((NODE*)a)->y > ((NODE*)b)->y ? 1 : -1;
}
int cmp2(const void *a,const void *b)
{
if( ((xx*)a)->x1 != ((xx*)b)->x1)
return ((xx*)a)->x1 > ((xx*)b)->x1 ? 1 : -1;
else
return ((xx*)a)->x2 > ((xx*)b)->x2 ? 1 : -1;
}
int kruskal()
{
int i,v1,v2,q=0;
qsort(node,k,sizeof(NODE),cmp);
for(i=0;i<k;i++)
{
v1=find(node[i].x);
v2=find(node[i].y);
if(v1!=v2&&node[i].w!=0)
{
tt[q].x1=node[i].x;
tt[q].x2=node[i].y;
pre[v2]=v1;
q++;
}
}
return q;
}
int main()
{
int t,n,i,j,num;
scanf("%d",&t);
while(t--)
{
k=0;
scanf("%d",&n);
for(i=1;i<=n;i++)
pre[i]=i;
for(i=1;i<=n;i++)
for(j=1;j<=n;j++)
scanf("%d",&a[i][j]);
for(i=1;i<=n;i++)
for(j=i+1;j<=n;j++)
{
node[k].x=i;
node[k].y=j;
node[k].w=a[i][j];
k++;
}
num=kruskal();
if(num==n-1)
{
qsort(tt,num,sizeof(xx),cmp2);
for(i=0;i<num-1;i++)
printf("%d %d ",tt[i].x1,tt[i].x2);
printf("%d %d\n",tt[num-1].x1,tt[num-1].x2);
}
else
printf("-1\n");
}
return 0;
}
这个代码是AC的,如果把第14行节点大小定义为NODE node[1005]。。。。是的,最初没考虑全,开小了,可是也不至于直接就给我WA!!!!!!!!本来开始时想到了用多级排序就可以搞定输出,很得意,可这个刚开始的WA让我一下子就没了感觉了。。。该死的WA。。。。。
还有,最后的qsort放在if之外也能过,不过费时了。
嗯,如果当时直接把数组开大点的话,也就不用这么纠结了,唉唉唉唉唉。。。。。。不过,总算AC了,最小生成树就先告一段落了,尽管用的只是kruskal,回头再练prime吧,下一步DP。。。