• USACO2.43Cow Tours(floyd+dfs)


    dfs用来求这个节点属于哪一块 用floyd求出各点间的最短距离 再求出每个节点可达到的最远距离MAX[i]以及这两个块中的最长距离a,b. 枚举当两个节点不在一块中 dis = max{(dis[i][j]+MAX[i]+MAX[j] ),a,b),在求出dis中最小的。

    View Code
     1 /*
     2      ID: shangca2
     3      LANG: C++
     4      TASK: cowtour
     5  */
     6 #include <iostream>
     7 #include<cstdio>
     8 #include<cstring>
     9 #include<algorithm>
    10 #include<stdlib.h>
    11 #include<cmath>
    12 using namespace std;
    13 #define INF 0x3f3f3f
    14 struct node
    15 {
    16     int x,y;
    17 }no[200];
    18 double w[200][200],m[200],a[5];
    19 int n,vis[200];
    20 void dfs(int x,int d)
    21 {
    22     int i;
    23     for(i = 1; i <= n ; i++)
    24         if(!vis[i]&&w[x][i]!=INF)
    25         {
    26             vis[i] = d;
    27             dfs(i,d);
    28         }
    29 }
    30 int main()
    31 {
    32     freopen("cowtour.in","r",stdin);
    33     freopen("cowtour.out","w",stdout);
    34     int i,j,k;
    35     char c;
    36     cin>>n;
    37     for(i = 1; i <= n ; i++)
    38     cin>>no[i].x>>no[i].y;
    39     for(i = 1; i <= n ; i++)
    40     {
    41         for(j = 1; j <= n ; j++)
    42         {
    43             cin>>c;
    44             if(c=='1')
    45             w[i][j] = 1.0*sqrt((no[i].x-no[j].x)*(no[i].x-no[j].x)+(no[i].y-no[j].y)*(no[i].y-no[j].y));
    46             else
    47             w[i][j] = INF;
    48         }
    49     }
    50     int g = 1;
    51     for(i = 1; i <= n ; i++)
    52         if(!vis[i])
    53         {
    54             vis[i] = g;
    55             dfs(i,g++);
    56         }
    57     for(i = 1; i <= n ; i++)
    58     w[i][i] = 0;
    59     for(i = 1; i <= n ; i++)
    60         for(j = 1; j <= n ; j++)
    61             for(k = 1; k <= n ; k++)
    62             {
    63                 if(w[j][k]>w[j][i]+w[i][k])
    64                 w[j][k]=w[j][i]+w[i][k];
    65             }
    66     for(i = 1; i <= n ; i++)
    67         for(j = 1; j <= n ;j++)
    68         {
    69             if(w[i][j]<INF)
    70             a[vis[i]] = max(a[vis[i]],w[i][j]);
    71         }
    72     for(i = 1; i <= n ; i++)
    73     {
    74         m[i] = 0;
    75         for(j = 1; j <= n ; j++)
    76         if(w[i][j]<INF)
    77         m[i] = max(m[i],w[i][j]);
    78     }
    79     double mi=INF,mm = INF;
    80 
    81     for(i = 1; i <= n ; i++)
    82     {
    83         for(j = 1; j <= n ; j++)
    84         {
    85             if(vis[i]!=vis[j])
    86             {
    87                 mi = m[i]+m[j]+1.0*sqrt((no[i].x-no[j].x)*(no[i].x-no[j].x)+(no[i].y-no[j].y)*(no[i].y-no[j].y));
    88                 mi = max(mi,a[1]);
    89                 mi = max(mi,a[2]);
    90             }
    91             if(mi<mm)
    92             mm = mi;
    93         }
    94     }
    95     printf("%.6lf\n",mm);
    96     return 0;
    97 }
  • 相关阅读:
    iOS开发之字符串去掉首尾空格换行
    iOS开发之截取UIScrollView长图方法、截长图
    iOS开发之语音录制
    iOS开发之程序各种状态监听
    iOS开发之监听应用进入前台后台
    iOS开发之波浪动画效果
    mysql 主从一致性检查
    git 备份和恢复
    tomcat server.xml配置文件 解析
    检查MySQL主从数据一致性
  • 原文地址:https://www.cnblogs.com/shangyu/p/3046751.html
Copyright © 2020-2023  润新知