弗洛伊德算法,也是首次接触,虽然思想蛮简单,但是写出来真心话了很多时间,总有一些细节错误,还有方向上的,比如DP数组一开始用了三维,结果超内存。还有就是判断连通分量的时候也是一错再错,…………最后还是用了广搜……最后就是题目上的一些问题了,没有想太仔细结果错了。下面贴代码,作纪念。

View Code
  1 /*{
  2 ID:jzy3209981
  3 PROG:cowtour
  4 LANG:C++
  5 }*/
  6 #include<stdio.h>
  7 #include<iostream>
  8 #include<string.h>
  9 #include<math.h>
 10 using namespace std;
 11 
 12 int state[150];
 13 int No[150];
 14 double longest[151];
 15 char grid[150][150];
 16 int coordinate[150][2];
 17 double dp[151][151];
 18 double MAX;
 19 void getstate(int n)
 20 {
 21     int p=0,q=0,i,j,sta=0;
 22     for(i=0;i<n;i++)
 23     {
 24         if(state[i]!=0)
 25             continue;
 26         memset(No,0,150*sizeof(int));
 27         No[q]=i;
 28         q++;
 29         sta++;
 30         state[i]=sta;
 31         while(p<q)
 32         {
 33             for(j=0;j<n;j++)
 34                 if(grid[No[p]][j]=='1'&&state[j]==0)
 35                 {
 36                     No[q]=j;
 37                     state[j]=sta;
 38                     q++;
 39                 }
 40                 p++;
 41         }
 42     }
 43 }
 44 double min(double a,double b)
 45 {
 46     return a<b?a:b;
 47 }
 48 void floyd(int n)
 49 {
 50     int i,j,k;
 51     double max;
 52     for(k=0;k<=n;k++)
 53         for(i=1;i<=n;i++)
 54             for(j=1;j<=n;j++)        
 55             {
 56                 if(j<i)
 57                     dp[i][j]=dp[j][i];
 58                 else if(i==j)
 59                     dp[i][j]=0;
 60                 else if(k==0)
 61                 {
 62                     if(grid[i-1][j-1]=='1')
 63                         dp[i][j]=sqrt((coordinate[i-1][0]-coordinate[j-1][0])*(coordinate[i-1][0]-coordinate[j-1][0])+(coordinate[i-1][1]-coordinate[j-1][1])*(coordinate[i-1][1]-coordinate[j-1][1]));
 64                     else
 65                         dp[i][j]=1000000000000;
 66                 }
 67                 else
 68                     dp[i][j]=min(dp[i][j],dp[i][k]+dp[k][j]);
 69             }
 70     for(i=1;i<=n;i++)
 71     {
 72         max=0;
 73         for(j=1;j<=n;j++)            
 74         {
 75             if(dp[i][j]>max&&state[j-1]==state[i-1])
 76                 max=dp[i][j];
 77         }
 78         longest[i-1]=max;
 79         if(max>MAX)
 80             MAX=max;
 81     }    
 82 }
 83 int main()
 84 {
 85     freopen ("cowtour.in","r",stdin);
 86     freopen ("cowtour.out","w",stdout);
 87     int n,i,j;
 88     double minn=1000000000000,dis;
 89     scanf("%d",&n);
 90     for(i=0;i<n;i++)
 91         scanf("%d%d",&coordinate[i][0],&coordinate[i][1]);
 92     getchar();
 93     for(i=0;i<n;i++)
 94     {
 95         for(j=0;j<n;j++)
 96             scanf("%c",&grid[i][j]);
 97         getchar();
 98     }
 99     getstate(n);
100     floyd(n);
101     for(i=0;i<n;i++)
102         for(j=0;j<n;j++)
103         {
104             if(state[i]!=state[j])
105             {
106                 dis=longest[i]+longest[j]+sqrt((coordinate[i][0]-coordinate[j][0])*(coordinate[i][0]-coordinate[j][0])+(coordinate[i][1]-coordinate[j][1])*(coordinate[i][1]-coordinate[j][1]));
107                 if(dis<minn)
108                     minn=dis;
109             }
110         }
111     printf("%.6f\n",minn>MAX?minn:MAX);
112     return 0;
113 }

 

posted on 2012-08-06 15:51  醉春雨  阅读(223)  评论(0)    收藏  举报