标签:ack describe create include minimal math nsis data oss
Time Limit: 1000MS | Memory Limit: 10000K | |||
Total Submissions: 11071 | Accepted: 3145 | Special Judge |
Description
Input
Output
Sample Input
9 1 5 0 0 3 2 4 5 5 1 0 4 5 2 1 2 5 3 3 1 3 9 7 1 2
Sample Output
1 6 3 7 4 9 5 78 3
题意:有一些村庄,给出坐标,村庄顺序从1往后加,然后再给出几个相连的村庄!求出为使全部村庄相连且路最短,所须要连接的村庄。
两种代码:
prim:
#include<stdio.h> #include<algorithm> #include<math.h> using namespace std; #define N 1000 #define INF 0xfffffff int country,workout; int x[N],y[N],v[N],per[N]; double map[N][N]; double d(int i,int j) { double c; return c=sqrt((x[i]-x[j])*(x[i]-x[j])+(y[i]-y[j])*(y[i]-y[j])); } void prim() { double mincost,cost[N]; int i,j,next; for(i=1;i<=country;i++) { cost[i]=map[1][i]; v[i]=0; per[i]=1;//记录此时的中心点 } v[1]=1; for(i=2;i<=country;i++) { mincost=INF; for(j=1;j<=country;j++)//寻找近期距离的村庄 { if(!v[j]&&mincost>cost[j]) { next=j; mincost=cost[j]; } } if(map[per[next]][next]) printf("%d %d\n",per[next],next); v[next]=1; for(j=1;j<=country;j++) { if(!v[j]&&cost[j]>map[next][j]) { cost[j]=map[next][j]; per[j]=next;//更换中心点 } } } } int main() { scanf("%d",&country); int i,j; for(i=1;i<=country;i++) { scanf("%d%d",&x[i],&y[i]); } for(i=1;i<=country;i++) for(j=i+1;j<=country;j++) { map[j][i]=map[i][j]=d(i,j); } scanf("%d",&workout); int a,b,c; for(i=1;i<=workout;i++) { scanf("%d%d",&a,&b); map[b][a]=map[a][b]=0; } prim(); return 0; }克鲁斯卡尔:#include<stdio.h> #include<algorithm> #include<math.h> using namespace std; #define N 1100 int country,road,workout,set[N]; int x[N],y[N]; struct line { int bg; int ed; double dis; }num[N*N]; double d(int i,int j) { double c; return c=sqrt((x[i]-x[j])*1.0*(x[i]-x[j])+(y[i]-y[j])*(y[i]-y[j])); } int cmp(line a,line b) { return a.dis<b.dis ; } int find(int p)//查找 { int t; int child=p; while(p!=set[p]) p=set[p]; while(child!=p) { t=set[child]; set[child]=p; child=t; } return p; //return p==set[p]?p:set[p]=find(set[p]); } bool merge(int x,int y)//合并 { int fx=find(x); int fy=find(y); if(fx!=fy) { set[fx]=fy; return true; } return false; } int main() { scanf("%d",&country); int i,j; for(i=1;i<=country;i++) { set[i]=i; scanf("%d%d",&x[i],&y[i]); } int a,b,c; scanf("%d",&workout); while(workout--)//假设已经修过,直接合并 { scanf("%d%d",&a,&b); c=merge(a,b); } int t=0; for(i=1;i<country;i++) for(j=i+1;j<=country;j++) { num[t].bg =i; num[t].ed =j; num[t].dis =d(i,j); t++; } sort(num,num+t,cmp); for(i=0;i<t;i++) { if(merge(num[i].bg ,num[i].ed )) { printf("%d %d\n",num[i].bg ,num[i].ed ); } } }
标签:ack describe create include minimal math nsis data oss
原文地址:http://www.cnblogs.com/ljbguanli/p/7224262.html