zoukankan      html  css  js  c++  java
  • hdu 3832(最短路)

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

    思路:三次spfa求出1,2,3到各点的最短距离,然后枚举中间点到这三点的最短距离之和为ans,最后就是n-ans-1了。

     1 #include<iostream>
     2 #include<cstdio>
     3 #include<cstring>
     4 #include<algorithm>
     5 #include<queue>
     6 using namespace std;
     7 #define MAXN 222
     8 #define inf 1<<30
     9 struct Node{
    10     int x,y,r;
    11 }node[MAXN];
    12 int n;
    13 int map[MAXN][MAXN];
    14 bool mark[MAXN];
    15 int dd1[MAXN];
    16 int dd2[MAXN];
    17 int dd3[MAXN];
    18 
    19 bool Judge(int i,int j){
    20     int xx=node[i].x-node[j].x;
    21     int yy=node[i].y-node[j].y;
    22     if(xx*xx+yy*yy<=(node[i].r+node[j].r)*(node[i].r+node[j].r))
    23         return true;
    24     return false;
    25 }
    26 
    27 void SPFA(int st,int dd[]){
    28     memset(mark,false,sizeof(mark));
    29     for(int i=1;i<=n;i++)dd[i]=inf;
    30     mark[st]=true;
    31     dd[st]=0;
    32     queue<int>Q;
    33     Q.push(st);
    34     while(!Q.empty()){
    35         int u=Q.front();
    36         Q.pop();
    37         mark[u]=false;
    38         for(int i=1;i<=n;i++){
    39             if(map[u][i]&&dd[i]>dd[u]+map[u][i]){
    40                 dd[i]=dd[u]+map[u][i];
    41                 if(!mark[i]){
    42                     mark[i]=true;
    43                     Q.push(i);
    44                 }
    45             }
    46         }
    47     }
    48 }
    49 
    50 
    51 
    52 int main(){
    53     int _case;
    54     scanf("%d",&_case);
    55     while(_case--){
    56         scanf("%d",&n);
    57         for(int i=1;i<=n;i++){
    58             scanf("%d%d%d",&node[i].x,&node[i].y,&node[i].r);
    59         }
    60         memset(map,0,sizeof(map));
    61         for(int i=1;i<=n;i++){
    62             for(int j=i+1;j<=n;j++){
    63                 if(Judge(i,j))map[i][j]=map[j][i]=1;
    64             }
    65         }
    66         SPFA(1,dd1);
    67         SPFA(2,dd2);
    68         SPFA(3,dd3);
    69         int ans=inf;
    70         for(int i=1;i<=n;i++){
    71             if(dd1[i]!=inf&&dd2[i]!=inf&&dd3[i]!=inf&&dd1[i]+dd2[i]+dd3[i]<ans){
    72                 ans=dd1[i]+dd2[i]+dd3[i];
    73             }
    74         }
    75         if(ans<inf){
    76             printf("%d\n",n-ans-1);
    77         }else 
    78             puts("-1");
    79     }
    80     return 0;
    81 }
    View Code
  • 相关阅读:
    元素设置float属性后,其后面的元素的位置问题
    Vue.js经典开源项目汇总
    ES6-模块导入导出
    JavaScript内存泄漏
    父元素高度比子元素高度多几个像素的解决方法
    jasmine —— Spies(转)
    用npm-run自动化任务(转)
    AngularJS中页面传参方法
    Path模块部分常用函数解析——NodeJS
    html特殊字符表
  • 原文地址:https://www.cnblogs.com/wally/p/3095271.html
Copyright © 2011-2022 走看看