hdu 畅通工程再续

http://acm.hdu.edu.cn/showproblem.php?pid=1875

 1 #include <cstdio>

 2 #include <cstring>

 3 #include <cmath>

 4 #include <algorithm>

 5 #define maxn 1001

 6 using namespace std;

 7 const int inf=1<<30;

 8 

 9 int n;

10 double g[maxn][maxn];

11 bool vis[maxn];

12 double dis[maxn];

13 double sum;

14 bool flag=true;

15 

16 struct node

17 {

18     int x,y;

19 }p[maxn];

20 

21 

22 int sqr(int x)

23 {

24     return x*x;

25 }

26 

27 double dist(int x1,int y1,int x2,int y2)

28 {

29     return sqrt(sqr(x1-x2)+sqr(y1-y2));

30 }

31 

32 void prim()

33 {

34     memset(vis,false,sizeof(vis));

35     for(int i=0; i<n; i++) dis[i]=g[0][i];

36     dis[0]=0;

37     vis[0]=true;

38     for(int i=1; i<n; i++)

39     {

40         double m=(double)inf;

41         int x;

42         for(int y=0; y<n; y++) if(!vis[y]&&dis[y]<m) m=dis[x=y];

43         if(m==inf){flag=false;break;}

44         sum+=m;

45         vis[x]=true;

46         for(int y=0; y<n; y++) if(!vis[y]&&dis[y]>g[x][y]) dis[y]=g[x][y];

47 

48     }

49 }

50 int main()

51 {

52     int t;

53     scanf("%d",&t);

54     while(t--)

55     {

56        scanf("%d",&n);

57        for(int i=0; i<200; i++)

58        {

59            for(int j=0; j<200; j++)

60            {

61                if(i==j) g[i][j]=0;

62                else

63                 g[i][j]=g[j][i]=inf;

64            }

65        }

66        for(int i=0; i<n; i++)

67        {

68            scanf("%d%d",&p[i].x,&p[i].y);

69        }

70        for(int i=0; i<n; i++)

71        {

72            for(int j=0; j<n; j++)

73            {

74                if(i!=j){

75                double d=dist(p[i].x,p[i].y,p[j].x,p[j].y);

76                if(d>=10.0&&d<=1000.0) g[i][j]=d;

77                }

78            }

79        }

80        flag=true;

81        sum=0.0;

82        prim();

83        if(!flag) printf("oh!\n");

84        else

85        printf("%.1lf\n",(sum*100));

86     }

87     return 0;

88 }
View Code

 

你可能感兴趣的:(HDU)