1. 程式人生 > >HHHOJ 2018.10.4 ACM 造橋

HHHOJ 2018.10.4 ACM 造橋

c++ using name div nsa 技術分享 namespace its ridge

技術分享圖片

樣例

技術分享圖片
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 造橋