首页 > 代码库 > hdu 3832 Earth Hour

hdu 3832 Earth Hour

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

 1 #include <cstdio>
 2 #include <iostream>
 3 #include <cmath>
 4 #include <cstring>
 5 #include <vector>
 6 #include <algorithm>
 7 #include <queue>
 8 #define maxn 1001
 9 using namespace std;
10 const int inf=1<<28;
11 
12 int g[maxn][maxn];
13 bool vis[maxn];
14 int dis1[maxn],dis2[maxn],dis3[maxn];
15 int n;
16 struct node
17 {
18     int x,y,r;
19 }p[maxn];
20 int sqr(int x)
21 {
22     return x*x;
23 }
24 
25 void spfa(int src,int dis[])
26 {
27     queue<int>q;
28     memset(vis,false,sizeof(vis));
29     for(int i=0; i<=n; i++) dis[i]=inf;
30     dis[src]=0;
31     vis[src]=true;
32     q.push(src);
33     while(!q.empty())
34     {
35         int u=q.front(); q.pop();
36         vis[u]=false;
37         for(int i=0; i<n; i++)
38         {
39             if(dis[i]>dis[u]+g[u][i]&&g[u][i]!=inf)
40             {
41                 dis[i]=dis[u]+g[u][i];
42                 if(!vis[i])
43                 {
44                     q.push(i);
45                     vis[i]=true;
46                 }
47             }
48         }
49     }
50 }
51 
52 int main()
53 {
54     int t;
55     scanf("%d",&t);
56     while(t--)
57     {
58         scanf("%d",&n);
59         for(int i=0; i<=n; i++)
60         {
61             for(int j=0; j<=n; j++)
62             {
63                 if(i==j) g[i][j]=0;
64                 else g[i][j]=inf;
65             }
66         }
67         for(int i=0; i<n; i++)
68         {
69            cin>>p[i].x>>p[i].y>>p[i].r;
70         }
71         for(int i=0; i<n; i++)
72         {
73             for(int j=i+1; j<n; j++)
74             {
75                 if(sqrt(sqr(p[i].x-p[j].x)+sqr(p[i].y-p[j].y))<=(p[i].r+p[j].r))
76                 {
77                     g[i][j]=g[j][i]=1;
78                 }
79             }
80         }
81         spfa(0,dis1);
82         spfa(1,dis2);
83         spfa(2,dis3);
84         int min1=inf;
85         for(int i=0; i<n; i++)
86         {
87             //printf("%d %d %d\n",dis1[i],dis2[i],dis3[i]);
88             min1=min(min1,dis1[i]+dis2[i]+dis3[i]);
89         }
90         if(min1==inf) printf("-1\n");
91         else printf("%d\n",n-min1-1);
92     }
93     return 0;
94 }
View Code