弗洛伊德算法,也是首次接触,虽然思想蛮简单,但是写出来真心话了很多时间,总有一些细节错误,还有方向上的,比如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 }

浙公网安备 33010602011771号