Online Judge | Problem Set | Authors | Online Contests | User | ||||||
---|---|---|---|---|---|---|---|---|---|---|
Web Board Home Page F.A.Qs Statistical Charts | Current Contest Past Contests Scheduled Contests Award Contest |
请帮忙看看好吗?为什么答案对了还是WA?奇怪。用的是kruskal(初始化的时候把给定好的路径进行处理,直接加入连同集合里了)或者给些奇怪的数据吧。请帮忙看看好吗?为什么答案对了还是WA?奇怪。用的是kruskal(初始化的时候把给定好的路径进行处理,直接加入连同集合里了)或者给些奇怪的数据吧。 测试数据为 4 0 1 1 1 1 0 1 1 1 1 0 1 1 1 1 0 2 1 2 3 4 4 0 10 10 10 10 0 1 10 10 1 0 10 10 10 10 0 1 1 2 3 0 990 692 990 0 179 692 179 0 1 2 1 答案为 1 11 179 Code:如下: #include<stdio.h> #define MAX 10005 typedef struct{ int from; int to; int value; int flag; }edge; int vset[MAX]; int array[MAX][MAX]; edge e[MAX]; void insertsort( int n ) { int i,j; for(i=2;i<=n;i++) {if(e[i].value<e[i-1].value){ e[0]=e[i]; e[i]=e[i-1]; for(j=i-2;e[0].value<e[j].value;j--) { e[j+1]=e[j]; } e[j+1]=e[0]; } } } int kruskal(int n ) { int a,b,i,j,m1,m2,sn1,sn2,k,m; int sum=0; k=1; for(i=1;i<=n;i++) vset[i]=i; scanf("%d",&m); for(i=1;i<=m;i++) {scanf("%d %d",&a,&b); array[a][b]=-1; array[b][a]=-1; vset[a]=-2;vset[b]=-2; } for(i=1;i<=n;i++) for(j=i+1;j<=n;j++) { if(array[i][j]!=0&&array[i][j]!=-1) {e[k].from=i;e[k].to=j;e[k].value=array[i][j];e[k].flag=0;k++;} else if(array[i][j]==-1) {e[k].from=i;e[k].to=j;e[k].value=0;e[k].flag=1;k++;} } insertsort(n); k=1;j=1; while(k<n-m) { m1=e[j].from; m2=e[j].to; sn1=vset[m1]; sn2=vset[m2]; if(sn1!=sn2) { k++;e[j].flag=1; sum=e[j].value+sum; for(i=1;i<=n;i++) if(vset[i]==sn2) vset[i]=sn1;} j++; } return sum; } int main() { int i,j; int n,sum ; while(scanf("%d",&n)!=EOF){ for(i=1;i<=n;i++) for(j=1;j<=n;j++) { scanf("%d",&array[i][j]); } sum=kruskal(n); printf("%d\n",sum);} return 0;} Followed by:
Post your reply here: |
All Rights Reserved 2003-2013 Ying Fuchen,Xu Pengcheng,Xie Di
Any problem, Please Contact Administrator