社区讨论
WA on#7求调
P10819[EC Final 2020] City Brain参与者 1已保存回复 1
讨论操作
快速查看讨论及其快照的属性,并进行相关操作。
- 当前回复
- 1 条
- 当前快照
- 1 份
- 快照标识符
- @mi5w70j1
- 此快照首次捕获于
- 2025/11/19 19:01 4 个月前
- 此快照最后确认于
- 2025/11/19 19:44 4 个月前
CPP
#include <bits/stdc++.h>
using namespace std;
int n,m,k,s1,s2,t1,t2,dis[5010][5010],U,V,mn=0x3f3f3f3f,L1=0x3f3f3f3f,L2=0x3f3f3f3f;
vector<int >edge[5010];
bool vis[5010];
queue<int >q;
void bfs(int x){
memset(vis,0,sizeof(vis));
q.push(x);
vis[x]=1;
dis[x][x]=0;
while(!q.empty()){
int u=q.front();
q.pop();
for(int i=0;i<edge[u].size();i++){
int v=edge[u][i];
if(!vis[v]){
q.push(v);
dis[x][v]=dis[x][u]+1;
vis[v]=1;
}
}
}
}
double calc(int x,int len){
int a=x/len;
int b=x%len;
return (len-b)*1.0/(a+1)+b*1.0/(a+2);
}
double f(int x){
if(L1==0&&L2==0)
return 0;
if(L1==0)
return calc(x,L2)*2;
if(L2==0)
return calc(k-x,L1);
return calc(k-x,L1)+calc(x,L2)*2;
}
int main(){
memset(dis,0x3f,sizeof(dis));
cin>>n>>m>>k;
while(m--){
int x,y;
cin>>x>>y;
edge[x].push_back(y);
edge[y].push_back(x);
}
for(int i=1;i<=n;i++)
bfs(i);
cin>>s1>>t1>>s2>>t2;
if(s1==t1&&s2==t2){
cout<<"0.000000000";
return 0;
}
for(int i=1;i<=n;i++)
for(int j=1;j<=n;j++){
if(i==j)
continue;
long long Dis=dis[s1][i]+dis[s2][i]+dis[i][j]*2+dis[j][t1]+dis[j][t2];
if(mn>Dis){
mn=Dis;
U=i;
V=j;
L1=dis[s1][U]+dis[s2][U]+dis[V][t1]+dis[V][t2];
L2=dis[U][V];
}
Dis=dis[s1][i]+dis[s2][j]+dis[i][j]*2+dis[j][t1]+dis[i][t2];
if(mn>Dis){
mn=Dis;
U=i;
V=j;
L1=dis[s1][U]+dis[s2][V]+dis[V][t1]+dis[U][t2];
L2=dis[U][V];
}
}
int l=0,r=k;//cout<<U<<" "<<V<<" "<<L1<<" "<<L2<<"\n";
while(l<=r){//cout<<l<<" "<<r<<"\n";
int mid1=l+(r-l)/3,mid2=r-(r-l)/3;
if(f(mid1)>f(mid2)){
l=mid1+1;
}
else{
r=mid2-1;
}
/*if(r-l<=10){
double ans=0x3f3f3f3f;
for(int i=l;i<=r;i++){
ans=min(ans,f(i));
}
printf("%.9lf",ans);
return 0;
}*/
}
printf("%.15lf",min(f(l),calc(k,dis[s1][t1]+dis[s2][t2])));
}
回复
共 1 条回复,欢迎继续交流。
正在加载回复...