superman

聚精会神搞建设 一心一意谋发展
posts - 190, comments - 17, trackbacks - 0, articles - 0
   :: 首页 :: 新随笔 :: 联系 :: 聚合  :: 管理

Section 2.4 - Cow Tours

Posted on 2009-04-23 16:02 superman 阅读(189) 评论(0)  编辑 收藏 引用 所属分类: USACO
  1 #include <cmath>
  2 #include <iostream>
  3 
  4 using namespace std;
  5 
  6 struct Point
  7 {
  8     int x, y;
  9 }   ;
 10 
 11 int sqr(int n)
 12 {
 13     return n * n;
 14 }
 15 
 16 int n;
 17 Point p[150];
 18 bool adj[150][150];
 19 double dist[150][150];
 20 
 21 int subGraphCnt;
 22 
 23 int visited[150];
 24 void dfs(int p)
 25 {
 26     visited[p] = subGraphCnt;
 27     for (int i = 0; i < n; i++)
 28         if (adj[p][i] == true && visited[i] == false)
 29             dfs(i);
 30 }
 31 
 32 int main()
 33 {
 34     freopen("cowtour.in""r", stdin);
 35     freopen("cowtour.out""w", stdout);
 36 
 37     cin >> n;
 38     for (int i = 0; i < n; i++)
 39         cin >> p[i].x >> p[i].y;
 40 
 41     cin.get();
 42     for (int i = 0; i < n; i++)
 43     {
 44         for (int j = 0; j < n; j++)
 45         {
 46             char c;
 47             c = cin.get();
 48             adj[i][j] = c - '0';
 49         }
 50         cin.get();
 51     }
 52 
 53     for (int i = 0; i < n; i++)
 54         for (int j = i + 1; j < n; j++)
 55             if (adj[i][j])
 56             {
 57                 int tmp = sqr(p[i].x - p[j].x) + sqr(p[i].y - p[j].y);
 58                 dist[i][j] = dist[j][i] = sqrt(tmp);
 59             }
 60             else
 61                 dist[i][j] = dist[j][i] = INT_MAX;
 62 
 63     for (int k = 0; k < n; k++)
 64     for (int i = 0; i < n; i++)
 65     for (int j = 0; j < n; j++)
 66         if (dist[i][k] != INT_MAX && dist[k][j] != INT_MAX)
 67             dist[i][j] <?= (dist[i][k] + dist[k][j]);
 68 
 69     for (int i = 0; i < n; i++)
 70         if (visited[i] == 0)
 71         {
 72             subGraphCnt++;
 73             dfs(i);
 74         }
 75 
 76     double x[150= { 0 };
 77     for (int i = 0; i < n; i++)
 78     for (int j = 0; j < n; j++)
 79         if (dist[i][j] != INT_MAX)
 80             x[i] >?= dist[i][j];
 81 
 82     double ans = INT_MAX;
 83     for (int i = 0; i < n; i++)
 84     for (int j = 0; j < n; j++)
 85         if (visited[i] != visited[j])
 86         {
 87             double tmp = sqrt(sqr(p[i].x - p[j].x) + sqr(p[i].y - p[j].y));
 88             tmp += (x[i] + x[j]);
 89             ans <?= tmp;
 90         }
 91     for (int i = 0; i < n; i++)
 92         ans >?= x[i];
 93 
 94     cout.setf(ios_base::showpoint);
 95     cout.setf(ios_base::fixed);
 96     cout.precision(6);
 97     cout << ans << endl;
 98 
 99     return 0;
100 }
101 

只有注册用户登录后才能发表评论。
网站导航: 博客园   IT新闻   BlogJava   知识库   博问   管理