USACO2.4のP1522-牛的旅行(Cow Tours)【最短路Flody】
生活随笔
收集整理的這篇文章主要介紹了
USACO2.4のP1522-牛的旅行(Cow Tours)【最短路Flody】
小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.
正題
評(píng)測記錄:https://www.luogu.org/recordnew/lists?uid=52918&pid=P1522
題目大意
有n個(gè)點(diǎn),連接任意兩個(gè)不同聯(lián)通塊上的點(diǎn),使這個(gè)新的聯(lián)通塊之間最遠(yuǎn)的兩個(gè)點(diǎn)的距離最遠(yuǎn)。
解題思路
先FlodyO(n3)O(n^3)O(n3)計(jì)算兩兩之間的距離
然后計(jì)算出每個(gè)點(diǎn)最遠(yuǎn)的點(diǎn)的距離,之后對(duì)于枚舉兩個(gè)不同聯(lián)通塊中的點(diǎn),那么可能產(chǎn)生的新的權(quán)值就是兩個(gè)個(gè)點(diǎn)的最遠(yuǎn)的點(diǎn)距離加上這兩個(gè)點(diǎn)之間的距離,但是還要和合并前聯(lián)通塊中最遠(yuǎn)的點(diǎn)的距離比較
code
// luogu-judger-enable-o2 #include<cstdio> #include<algorithm> #include<cmath> #include<iostream> #define N 160 #define pows(x) x*x using namespace std; int n,inx[N],tot; double x[N],y[N],a[N][N],d[N],md[N],mins; char c; double const_dis(int i,int j) {return sqrt((x[i]-x[j])*(x[i]-x[j])+(y[i]-y[j])*(y[i]-y[j])); } void dfs(int x)//分聯(lián)通塊 {inx[x]=tot;for(int i=1;i<=n;i++)if(!inx[i]&&a[x][i]!=2147483647)dfs(i); } int main() {scanf("%d",&n);for(int i=1;i<=n;i++)scanf("%lf%lf",&x[i],&y[i]);for(int i=1;i<=n;i++)for(int j=1;j<=n;j++){cin>>c;if(c=='1')a[i][j]=const_dis(i,j);else if(i!=j) a[i][j]=2147483647;}for(int i=1;i<=n;i++)if(!inx[i]) tot++,dfs(i);for(int k=1;k<=n;k++)for(int i=1;i<=n;i++)for(int j=1;j<=n;j++)if(a[i][k]+a[k][j]<a[i][j])a[i][j]=a[i][k]+a[k][j];//計(jì)算最短路for(int i=1;i<=n;i++){for(int j=1;j<=n;j++)if(a[i][j]!=2147483647)md[i]=max(md[i],a[i][j]);//每個(gè)點(diǎn)的最遠(yuǎn)距離d[inx[i]]=max(d[inx[i]],md[i]);//每個(gè)聯(lián)通塊最遠(yuǎn)距離}mins=2147483647;for(int i=1;i<n;i++)for(int j=i+1;j<=n;j++)if(inx[i]!=inx[j])mins=min(mins,max(md[i]+md[j]+const_dis(i,j),max(d[inx[i]],d[inx[j]])));printf("%.6lf",mins); }總結(jié)
以上是生活随笔為你收集整理的USACO2.4のP1522-牛的旅行(Cow Tours)【最短路Flody】的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: USACO2.4のP1519-穿越栅栏(
- 下一篇: nssl1231-Gift【01背包,d