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 }

 

 

posted on 2012-09-10 21:12  xinmenghuairi  阅读(355)  评论(0编辑  收藏  举报