冠君
一直在努力

题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=3832

求出三点到某一点的最短路径和的最小值,问题即迎刃而解。

#include<iostream>
#include<cstring>
using namespace std;
#define INE 1000000
struct Point {
    int x,y,r;
}point[202];
int map[202][202];
int dis[3][202];
int ok(Point a,Point b)
{
    if((a.x-b.x)*(a.x-b.x)+(a.y-b.y)*(a.y-b.y)<=
       (a.r+b.r)*(a.r+b.r))
       return 1;
    return 0;
}
void Dijkstra(int s,int n,int *dis)
{
    int vist[202];
    int i,j,u,min;
    memset(vist,0,sizeof(vist));
    for(i=0;i<n;i++)
      dis[i]=INE;
    vist[s]=1;
    dis[s]=0;
    u=s;
    for(i=0;i<n;i++){
        for(j=0;j<n;j++)
         if(map[u][j]&&dis[j]>dis[u]+map[u][j])
            dis[j]=dis[u]+map[u][j];
        min=INE;
        for(j=0;j<n;j++)
          if(!vist[j]&&min>dis[j]){
             min=dis[j];
             u=j;
          }
          vist[u]=1;
    }
}
int main()
{
    int T;
    cin>>T;
    while(T--){
        int n;
        cin>>n;
        int i,j;
        for(i=0;i<n;i++)
          cin>>point[i].x>>point[i].y>>point[i].r;
        memset(map,0,sizeof(map));
        for(i=0;i<n;i++)
         for(j=0;j<n;j++)
          if(ok(point[i],point[j]))
            map[i][j]=map[j][i]=1;
        Dijkstra(0,n,dis[0]);
        Dijkstra(1,n,dis[1]);
        Dijkstra(2,n,dis[2]);
        int sum=INE;
        for(i=0;i<n;i++)
          if(dis[0][i]!=INE&&dis[1][i]!=INE&&dis[2][i]!=INE)
             if(dis[0][i]+dis[1][i]+dis[2][i]<sum)
                sum=dis[0][i]+dis[1][i]+dis[2][i];
        if(sum==INE) cout<<-1<<endl;
        else cout<<n-sum-1<<endl;
    }
    return 0;
}
posted on 2011-08-24 10:32  冠君———直在努力  阅读(247)  评论(0编辑  收藏  举报