usaco Cow Tours
?題意是給出一個(gè)不連通的圖,然后定義了一個(gè)直徑:聯(lián)通分量里最短距離最長的兩個(gè)點(diǎn)之間的距離。
?求將一個(gè)不連通的圖中的兩個(gè)連通分量連接,生成的這個(gè)新分量的直徑最小可以有多小,輸出這個(gè)新直徑。
做法是想用Floyd求出任意兩點(diǎn)之間的最短距離,然后求出每個(gè)點(diǎn)到未生成新圖之前的這個(gè)點(diǎn)所在分量的最遠(yuǎn)的一個(gè)點(diǎn)的距離。然后枚舉聯(lián)通兩個(gè)不相連的兩個(gè)點(diǎn),這兩個(gè)點(diǎn)的所在分量的最遠(yuǎn)距離,加上這兩個(gè)點(diǎn)之間的距離,就是新生成的牧場(chǎng)的直徑。
題目保證一定會(huì)有未聯(lián)通的兩個(gè)分量:
但是:這道題的第7個(gè)測(cè)試點(diǎn)我就是死活過不去,然后把這個(gè)數(shù)據(jù)分析了一下發(fā)現(xiàn),這個(gè)測(cè)試點(diǎn)里的所有點(diǎn)都聯(lián)通。
在此之前我還專門證明過,一個(gè)分量內(nèi)部的直徑一定小于兩個(gè)分量相連之后新生成的分量的直徑。結(jié)果題目這種測(cè)試數(shù)據(jù)和題目描述不一致坑的我什么都不想說了。
我就是想問一下人與人之間基本的信任呢
/* ID: modengd1 PROG: cowtour LANG: C++ */ #include <iostream> #include <stdio.h> #include <memory.h> #include <math.h> #define INF 0xfffffff using namespace std; typedef pair<int,int> Coor; double longestdist[151]; double A[151][151]; Coor coor[151]; bool con[151][151]; int N; void Floyd() {//求任意間接聯(lián)通的兩點(diǎn)之間的最短路徑,并標(biāo)記它們之間的間接聯(lián)通關(guān)系for(int k=0;k<N;k++){for(int i=0;i<N;i++){if(A[i][k]!=INF&&k!=i)for(int j=0;j<N;j++){if(A[k][j]!=INF&&k!=j){A[i][j]=min(A[i][j],A[i][k]+A[k][j]);con[i][j]=true;}}}} } double dis(Coor A,Coor B) {return sqrt((A.first-B.first)*(A.first-B.first)+(A.second-B.second)*(A.second-B.second)); } void slove() {double ans=INF;//找到每個(gè)節(jié)點(diǎn)所在分量中離這個(gè)節(jié)點(diǎn)最遠(yuǎn)的一個(gè)坐標(biāo)的距離for(int i=0;i<N;i++){for(int j=0;j<N;j++){if(con[i][j]){longestdist[i]=max(longestdist[i],A[i][j]);}}}//枚舉任意兩個(gè)不連通的點(diǎn)并且模擬將這兩個(gè)點(diǎn)聯(lián)通之后形成新牧場(chǎng)的直徑for(int i=0;i<N-1;i++){for(int j=1+i;j<N;j++){if(!con[i][j]){ans=min(ans,longestdist[i]+longestdist[j]+dis(coor[i],coor[j]));}}}for(int i=0;i<N;i++)//處理假如數(shù)據(jù)已經(jīng)全部連通了怎么辦(題目強(qiáng)調(diào)一定有沒連通的兩個(gè)點(diǎn),又碰見這種測(cè)試數(shù)據(jù)和題目描述不一樣的我也是醉了ans=max(longestdist[i],ans);printf("%.6lf\n",ans); } int main() {freopen("cowtour.in","r",stdin);freopen("cowtour.out","w",stdout);scanf("%d",&N);int a,b;char ch;for(int i=0;i<N;i++){scanf("%d%d",&a,&b);coor[i].first=a;coor[i].second=b;}getchar();for(int i=0;i<N;i++){for(int j=0;j<N;j++){scanf("%c",&ch);if(ch=='0')//判斷是否直接聯(lián)通并且初始化用來Floyd的A數(shù)組{con[i][j]=false;A[i][j]=INF;}else{con[i][j]=true;A[i][j]=dis(coor[i],coor[j]);}}getchar();con[i][i]=true;//自己到自己一定是聯(lián)通的且距離為0A[i][i]=0;}Floyd();slove();return 0; }
轉(zhuǎn)載于:https://www.cnblogs.com/modengdubai/p/4786944.html
總結(jié)
以上是生活随笔為你收集整理的usaco Cow Tours的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 项目中通用的顶部标题和返回的TitleB
- 下一篇: hdu1466(dp)