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 |
你仔细看一下输入输出,uva改了原题,我没改的In Reply To:Help :( Posted by:discovery at 2004-08-19 23:37:12 > UVA上也交了,官方数据也测了,都是对的。。 > 谁能告诉我问什么在这里Wrong Answer? > #include <stdio.h> > #include <math.h> > #include <string.h> > > #define maxn 800 > > struct Tpoint{int x,y;}; > struct Tedge{double len;int a,b;}; > Tpoint town[maxn]; > Tedge g[maxn][maxn],ans[maxn]; > int n,m,count,tot,casenum,father[maxn],color[maxn]; > > double getdist(Tpoint a,Tpoint b) > { > double x=a.x-b.x,y=a.y-b.y; > return sqrt(x*x+y*y); > } > > int findset(int x) > { > if (father[x]==x) return x; > father[x]=findset(father[x]); > return father[x]; > } > > void unionset(int x,int y) > { > int rootx,rooty; > rootx=findset(x); rooty=findset(y); > father[rootx]=rooty; > } > > void init() > { > int i,j,a,b,roota,rootb,colora,colorb,now; > double len; > scanf("%d",&n); > for (i=1;i<=n;i++) { > scanf("%d%d",&town[i].x,&town[i].y); > father[i]=i; > } > count=n; > scanf("%d",&m); > for (i=1;i<=m;i++) { > scanf("%d%d",&a,&b); > roota=findset(a); rootb=findset(b); > if (roota!=rootb) { > unionset(roota,rootb); > count--; > } > } > now=0; > for (i=1;i<=n;i++) > if (father[i]==i) color[i]=++now; > for (i=1;i<=count;i++) > for (j=1;j<=count;j++) { > g[i][j].len=100000000; > g[i][j].a=g[i][j].b=-1; > } > for (i=1;i<=n;i++) > for (j=1;j<=n;j++) { > roota=findset(i); rootb=findset(j); > colora=color[roota]; colorb=color[rootb]; > if (roota!=rootb) { > len=getdist(town[i],town[j]); > if (len<g[colora][colorb].len) { > g[colora][colorb].len=g[colorb][colora].len=len; > g[colora][colorb].a=i; g[colora][colorb].b=j; > g[colorb][colora].a=i; g[colorb][colora].b=j; > } > } > } > } > > void work() > { > double dist[maxn]; > bool used[maxn]; > int i,j,min,father[maxn]; > tot=0; > memset(used,false,sizeof(used)); > used[1]=true; > for (i=2;i<=count;i++) { > father[i]=1; > dist[i]=g[1][i].len; > } > for (i=2;i<=count;i++) { > min=-1; > for (j=1;j<=count;j++) > if (!used[j] && (min==-1 || dist[j]<dist[min])) min=j; > ans[++tot]=g[father[min]][min]; > used[min]=true; > for (j=1;j<=count;j++) > if (!used[j] && (g[min][j].len<dist[j])) { > father[j]=min; > dist[j]=g[min][j].len; > } > } > } > > void print() > { > int i; > if (count==1) printf("\n"); > else for (i=1;i<=tot;i++) > printf("%d %d\n",ans[i].a,ans[i].b); > } > > int main() > { > scanf("%d",&casenum); > while (casenum--) { > init(); > work(); > print(); > if (casenum) printf("\n"); > } > return 0; > } Followed by:
Post your reply here: |
All Rights Reserved 2003-2013 Ying Fuchen,Xu Pengcheng,Xie Di
Any problem, Please Contact Administrator