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;
}
//然后枚举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;
}
相关文章推荐
- hdu 3832 Earth Hour(最短路 spfa dijkstra)
- hdoj 3832 Earth Hour 【最短路&&SPFA】
- hdu 3832 Earth Hour (最短路变形)
- HDU 3832 Earth Hour 【最短路好题 + 思维】
- HDU 3832 Earth Hour(最短路)
- HDU 3832 Earth Hour 最短路(三点联系,有一个公共区)
- HDU 3832 Earth Hour (最短路)
- HDU-3832 Earth Hour 最短路
- hdu 3832 Earth Hour (最短路变形)
- hdu 3832 Earth Hour(最短路变形)
- HDU 3832 Earth Hour(最短路)
- HDU 3832 Earth Hour (最短路)
- HDU 2544 最短路(spfa邻接矩阵)
- hdu 0 or 1(最短路spfa)(本质,抽象)
- HDU 4370 巧妙的最短路SPFA
- hdu 5521 Meeting【最短路SPFA+建图】
- 【最短路+spfa+有难度】杭电 hdu 2377 Bus Pass
- HDU - 6166 SPFA最短路次短路 or 二进制+Dijstra
- [HDU 1548] SPFA 最短路权值设为1, 然后求a--b的最短路
- hdu 1535 Invitation Cards 最短路spfa+逆向建图