HHHOJ 2018.10.4 ACM 造桥
Posted greed-vi
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了HHHOJ 2018.10.4 ACM 造桥相关的知识,希望对你有一定的参考价值。
样例
5 1 3 2 -3 6 -2 3 2 5 1 5 0 1 2 1 4 0 2 3 5 4 10
3 5
思路
坑啊,当时没打出来,精度问题,double返回int再返回到double函数里位数不一样(用一个变量存一下),其实很简单,先FLOYD一下,再找dis>p的点,把序号扔进数组里。
如x1,y1建桥到x2,y2就有两种方法:1.先到1再到2再到0 2.先到2再到1再到0。
若两种方法都不可行,则不可行,不然tot++,然后保存两点编号。
代码
1 #include<bits/stdc++.h> 2 using namespace std; 3 double path[105][105]; 4 bool f=0; 5 int n,m,tot=0,p,ansa,ansb; 6 double x[105],y[105]; 7 int q[105],top=0; 8 double anss=2e9; 9 double getlen(int a,int b){return (double)sqrt((x[a]-x[b])*(x[a]-x[b])+(y[a]-y[b])*(y[a]-y[b]));} 10 int main() 11 { 12 freopen("bridge.in","r",stdin); 13 freopen("bridge.out","w",stdout); 14 cin>>n; 15 x[0]=0;y[0]=0; 16 for (int i=1;i<=n;i++) cin>>x[i]>>y[i]; 17 cin>>m; 18 for (int i=0;i<=n;i++)for (int j=0;j<=n;j++)path[i][j]=2e9; 19 for (int i=1;i<=m;i++) 20 { 21 int a,b; 22 cin>>a>>b; 23 path[a][b]=path[b][a]=getlen(a,b); 24 } 25 cin>>p; 26 for (int k=0;k<=n;k++) 27 for (int i=0;i<=n;i++) 28 for (int j=0;j<=n;j++) 29 path[i][j]=min(path[i][j],path[i][k]+path[k][j]); 30 for (int i=0;i<=n;i++) path[i][i]=0; 31 for(int i=1;i<=n;i++)if(path[i][0]>p)q[++top]=i; 32 for (int i=0;i<=n;i++) 33 for (int j=i+1;j<=n;j++) 34 { 35 bool flag=0; 36 double ans=getlen(i,j); 37 if(path[i][j]==ans||ans>anss)continue; 38 for (int k=1;k<=top;k++) if (path[q[k]][i]+ans+path[j][0]>p&&path[q[k]][j]+ans+path[i][0]>p) {flag=1;break;} 39 if (flag==0) if (anss==ans) tot++;else anss=ans,tot=1,ansa=i,ansb=j; 40 } 41 if(tot==0) {cout<<0<<endl;return 0;} 42 if (tot==1) cout<<ansa<<" "<<ansb<<endl;else cout<<tot<<endl; 43 return 0; 44 } 45 /* 46 5 47 1 3 48 2 -3 49 6 -2 50 3 2 51 5 1 52 5 53 0 1 54 2 1 55 4 0 56 2 3 57 5 4 58 10 59 */
以上是关于HHHOJ 2018.10.4 ACM 造桥的主要内容,如果未能解决你的问题,请参考以下文章