HDU 3832 Earth Hour

来源:互联网 发布:java基础百度云 编辑:程序博客网 时间:2024/05/03 10:54

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

#include<iostream>#include<algorithm>#include<cmath>#include<queue>using namespace std;#define N 205#define M 400005#define inf 0x7fffffffstruct Graph{struct node{int next,v,w;node(){};node(int a,int b,int c){next=a;v=b;w=c;}}E[M];int head[N],dis[N];int NV,NE;bool h[N];void init(int n){NV=n;NE=0;memset(head,-1,sizeof(head));}void insert(int u,int v,int w){E[NE]=node(head[u],v,w);head[u]=NE++;}bool update(int u,int v,int w){if(dis[u]+w<dis[v]){dis[v]=dis[u]+w;return true;}return false;}void spfa(int s,int t){memset(h,0,sizeof(h));for(int i=0;i<=NV;i++)dis[i]=inf;dis[s]=0;queue<int> q;q.push(s);while(!q.empty()){int u=q.front();q.pop();h[u]=0;for(int i=head[u];i!=-1;i=E[i].next){int v=E[i].v;if(update(u,v,E[i].w)&&!h[v]){h[v]=1;q.push(v);}}}}}G;struct point{int x,y,r;}p[N];bool inter(point a,point b){int dis=(a.x-b.x)*(a.x-b.x)+(a.y-b.y)*(a.y-b.y);if(dis>(a.r+b.r)*(a.r+b.r))return false;return true;}int main(void){int t,n;scanf("%d",&t);while(t--){scanf("%d",&n);G.init(n);for(int i=1;i<=n;i++)scanf("%d%d%d",&p[i].x,&p[i].y,&p[i].r);for(int i=1;i<=n;i++)for(int j=i+1;j<=n;j++)if(inter(p[i],p[j])){G.insert(i,j,1);G.insert(j,i,1);}int dis1[N],dis2[N],dis3[N];G.spfa(1,n);for(int i=1;i<=n;i++)dis1[i]=G.dis[i];G.spfa(2,n);for(int i=1;i<=n;i++)dis2[i]=G.dis[i];G.spfa(3,n);for(int i=1;i<=n;i++)dis3[i]=G.dis[i];int Min=inf;for(int i=1;i<=n;i++)if(dis1[i]!=inf&&dis2[i]!=inf&&dis3[i]!=inf)if(dis1[i]+dis2[i]+dis3[i]<Min)Min=dis1[i]+dis2[i]+dis3[i];if(Min==inf)printf("-1\n");elseprintf("%d\n",n-Min-1);}}


原创粉丝点击