1162 这个题意是找这几个点的最短连通的最短路劲,就是将这些点的各个距离
算出来,先确定一个点进行最短路劲选择。
代码:
View Code
1 #include<iostream> 2 #include<math.h> 3 #define MAX 0x4f4f4f4f 4 using namespace std; 5 struct node{ 6 double x; 7 double y; 8 }node1[101]; 9 int n,mark[101]; 10 double dis[101],map[101][101]; 11 double mj(double x,double y,double x1,double y1) 12 { 13 return sqrt((x-x1)*(x-x1)+(y-y1)*(y-y1)); 14 } 15 void prim() 16 { 17 int i,j; 18 double ans=0; 19 for(i=1;i<=n;i++) 20 dis[i]=map[1][i]; 21 memset(mark,0,sizeof(mark)); 22 mark[1]=1; 23 for(i=1;i<n;i++) 24 { 25 int v; 26 double tem=MAX; 27 for(j=1;j<=n;j++) 28 if(!mark[j]&&dis[j]<tem) 29 v=j,tem=dis[j]; 30 mark[v]=1; 31 ans+=tem; 32 for(j=1;j<=n;j++) 33 { 34 tem=map[v][j]; 35 if(tem<dis[j]) 36 dis[j]=tem; 37 } 38 } 39 printf("%.2lf\n",ans); 40 41 } 42 int main() 43 { 44 int i,j; 45 while(cin>>n) 46 { 47 for(i=1;i<=n;i++) 48 cin>>node1[i].x>>node1[i].y; 49 for(i=1;i<=n;i++) 50 for(j=1;j<=n;j++) 51 map[i][j]=mj(node1[i].x,node1[i].y,node1[j].x,node1[j].y); 52 prim(); 53 } 54 } 55
1875 这道题跟1162相似。只要改下条件就可以了。起初我把条件给错了,害的
自己都不知道错在哪。千万要细心啊。
代码:
View Code
1 #include<iostream> 2 #include<math.h> 3 #define MAX 0x4f4f4f4f 4 using namespace std; 5 struct node{ 6 double x; 7 double y; 8 }node1[111]; 9 int n,mark[111]; 10 double dis[111],map[111][111]; 11 double mj(double x,double y,double x1,double y1) 12 { 13 return sqrt((x-x1)*(x-x1)+(y-y1)*(y-y1)); 14 } 15 void prim() 16 { 17 int i,j,s=0; 18 double ans=0; 19 for(i=1;i<=n;i++) 20 dis[i]=map[1][i]; 21 memset(mark,0,sizeof(mark)); 22 mark[1]=1; 23 for(i=1;i<n;i++) 24 { 25 int v; 26 double tem=MAX; 27 for(j=1;j<=n;j++) 28 if(!mark[j]&&dis[j]<tem) 29 v=j,tem=dis[j]; 30 if(tem==MAX) //即没找到符合条件的 31 { 32 s=1; 33 break; 34 } 35 mark[v]=1; 36 ans+=tem; 37 for(j=1;j<=n;j++) 38 { 39 tem=map[v][j]; 40 if(tem<dis[j]) 41 dis[j]=tem; 42 } 43 } 44 if(s) 45 cout<<"oh!"<<endl; 46 else 47 printf("%.1lf\n",ans*100); 48 49 } 50 int main() 51 { 52 int i,j,t; 53 double m; 54 cin>>t; 55 while(t--) 56 { 57 cin>>n; 58 for(i=1;i<=n;i++) 59 cin>>node1[i].x>>node1[i].y; 60 for(i=1;i<=n;i++) 61 for(j=1;j<=i;j++) 62 { 63 m=mj(node1[i].x,node1[i].y,node1[j].x,node1[j].y); 64 if(m>=10&&m<=1000) 65 map[i][j]=map[j][i]=m; 66 else 67 map[i][j]=map[j][i]=MAX;//把不符合条件的处理成无穷大数 68 } 69 prim(); 70 } 71 }