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 |
Re:primIn Reply To:prim Posted by:00448242 at 2005-07-14 14:04:06 谢谢各位,现在改了,还是超,现在要用1015MS吧,我会看看你们写的,研究一下 #include <stdio.h> #include <string.h> #define GetDisDB(x0,y0,x1,y1) ((x1-x0)*(x1-x0)+(y1-y0)*(y1-y0)) #define Max 751 typedef struct { int x,y; }Point; int HashConn[Max][Max]; int Map[Max][Max]; int SetConn[Max]; int ConnEndIndex; int SetLeft[Max]; int LeftEndIndex; int tmp[Max]; Point Value[Max]; void Build(int n) { int a,b,i,j,v; int index = 0; int curi,curj; while(LeftEndIndex) { a = b = 0; v = 0x0FFFFFFF; for(i= 1;i<=ConnEndIndex;i++) for(j=1;j<=LeftEndIndex;j++) { curi = SetConn[i]; curj = SetLeft[j]; if((Map[curi][curj]<v)) { a = curi; b = curj; v = Map[curi][curj]; index = j; } } if(!HashConn[a][b]) printf("%d %d\n",a,b); ConnEndIndex++; SetConn[ConnEndIndex] = b; memcpy(tmp,&SetLeft[index+1],(LeftEndIndex-index)*sizeof(int)); memcpy(&SetLeft[index],tmp,(LeftEndIndex-index)*sizeof(int)); LeftEndIndex--; } } int main() { int i,j,n,p,a,b; int x,y; scanf("%d",&n); { // memset(Map,0,sizeof(int)*Max*Max); // memset(SetConn,0,Max*sizeof(int)); // memset(SetLeft,0,Max*sizeof(int)); // memset(Value,0,Max*sizeof(Point)); memset(HashConn,0,sizeof(int)*Max*Max); for(i=1;i<=n;i++) { scanf("%d%d",&x,&y); Value[i].x = x; Value[i].y = y; SetLeft[i] = i+1; } for(i=1;i<=n;i++) for(j=i+1;j<=n;j++) { Map[i][j] = GetDisDB(Value[i].x,Value[i].y,Value[j].x,Value[j].y); Map[j][i] = Map[i][j]; } scanf("%d",&p); for(i=1;i<=p;i++) { scanf("%d%d",&a,&b); Map[a][b] = 0; Map[b][a] = 0; HashConn[a][b] = 1; HashConn[b][a] = 1; } LeftEndIndex = n - 1; ConnEndIndex = 1; SetConn[ConnEndIndex] = 1; Build(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