题目链接: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; }