您的位置:首页 > 其它

hdu 3832Earth Hour 最短路spfa

2015-03-16 21:52 375 查看
//用spfa求出1,2,3点到任意点的最短路

//然后枚举1,2,3,任意点u

//求出1,2,3,到u点的最短路之和ans

//其最n-ans-1即为最多能熄灭的灯数

#include<iostream>

#include<cstdio>

#include<cstring>

#include<queue>

using namespace std;

const int maxn=1010;

const int inf=99999;

int line[maxn][maxn];

int dis[4][maxn];

int vis[maxn];

int pos[maxn];

int N;

int dist(int a,int b)

{

return a*a+b*b;

}

queue<int>que;

int spfa(int start)

{

int i;

while(que.size())que.pop();

for(i=1;i<=N;i++)

dis[start][i]=(i==start?0:inf);

que.push(start);

while(que.size())

{

int now=que.front();

que.pop();

for(i=1;i<=N;i++)

{

if(dis[start][i]>dis[start][now]+line[now][i]&&dis[start][now]+line[now][i]>0)

{

dis[start][i]=dis[start][now]+line[now][i];

que.push(i);

}

}

}

return dis
>0;

}

struct node

{

int x,y;

int R;

}point[maxn];

int main()

{

//freopen("in.txt","r",stdin);

int T;int i,j;

scanf("%d",&T);

while(T--)

{

scanf("%d",&N);

for(i=1;i<=N;i++)

for(j=1;j<=N;j++)

line[i][j]=(i==j?0:inf);

for(i=1;i<=N;i++)

{

scanf("%d%d%d",&point[i].x,&point[i].y,&point[i].R);

for(j=1;j<i;j++)

{

int temp1=dist(point[i].x-point[j].x,point[i].y-point[j].y);

int temp2=(point[i].R+point[j].R)*(point[i].R+point[j].R);

if(temp1<=temp2)

line[i][j]=line[j][i]=1;

}

}

for(i=1;i<=3;i++)

spfa(i);

int ans=inf;

for(i=1;i<=N;i++)

ans=min(ans,dis[1][i]+dis[2][i]+dis[3][i]);

if(N-ans-1<0)

printf("-1\n");

else

printf("%d\n",N-ans-1);

}

return 0;

}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: