社区讨论
20分求助(有注释清晰版随时在线)
P1522[USACO2.4] 牛的旅行 Cow Tours参与者 1已保存回复 1
讨论操作
快速查看讨论及其快照的属性,并进行相关操作。
- 当前回复
- 1 条
- 当前快照
- 1 份
- 快照标识符
- @lo9borga
- 此快照首次捕获于
- 2023/10/28 08:47 2 年前
- 此快照最后确认于
- 2023/10/28 08:47 2 年前
CPP
#include<set>
#include<map>
#include<queue>
#include<stack>
#include<cmath>
#include<vector>
#include<string>
#include<cstdio>
#include<cstring>
#include<iostream>
#include<algorithm>
#include <iomanip>
#include <ctime>
#define INF 0x3f3f3f3f
#define x first
#define y second
#define lowbit(x) ((x) & (-x))
#define pi 4*atan(1.0)
#define N 500005
#define int long long
#define endl '\n'
using namespace std;
//int pri[]={ 2, 3, 5, 7, 11, 13, 17, 19, 23, 29, 31, 37, 41, 43, 47, 53, 59, 61, 67, 71, 73, 79, 83, 89, 97, 101};
typedef pair<int, int> PII;
//---------------------------------------------------------
//以上为头文件 let's go!
//---------------------------------------------------------
int n;
double g[200][200];
int field[200];
struct node
{
int x,y;
}p[200];
double dist(int x1,int y1,int x2,int y2)
{
return sqrt(pow(x1-x2,2)+pow(y1-y2,2));
}
void dfs(int x,int id)//染色
{
field[x]=id;
for(int i=1;i<=n;i++)
if(!field[i]&&g[x][i]<INF)
dfs(i,id);
}
void solve()
{
/* 读入所有的点 */
cin>>n;
for(int i=1;i<=n;i++)
{
int x,y;
cin>>x>>y;
p[i]={x,y};
}
/* 初始化邻接矩阵 */
for(int i=1;i<=n;i++)
for(int j=1;j<=n;j++)
{
int t;
scanf("%1lld",&t);
if(i==j)g[i][j]=0;
else
{
if(t==1)
{
g[i][j]=dist(p[i].x,p[i].y,p[j].x,p[j].y);
}
else
{
g[i][j]=INF;
}
}
}
/* dfs染色 */
int id=0;
for(int i=1;i<=n;i++)
if(!field[i])
dfs(i,++id);
/* floyd */
for(int k=1;k<=n;k++)
for(int i=1;i<=n;i++)
for(int j=1;j<=n;j++)
{
if(g[i][j]>g[i][k]+g[k][j])
{
g[i][j]=g[i][k]+g[k][j];
}
}
/* 求A B连通块的直径 */
double MAX_dis[150];
for(int i=1;i<=n;i++)
for(int j=1;j<=n;j++)
{
if(field[i]==field[j])
MAX_dis[field[i]]=max(g[i][j],MAX_dis[field[i]]);
}
/* 求每个点的最大距离 */
double MAX[150];
for(int i=1;i<=n;i++)
for(int j=1;j<=n;j++)
{
if(field[i]==field[j])
MAX[i]=max(g[i][j],MAX[i]);
}
/* ans */
double ans=INF;
for(int i=1;i<=n;i++)
for(int j=1;j<=n;j++)
{
if(field[i]!=field[j])
{
double t=max({MAX_dis[field[i]],MAX_dis[field[j]],MAX[i]+MAX[j]+dist(p[i].x,p[i].y,p[j].x,p[j].y)});
ans=min(ans,t);
}
}
//cout<<ans<<endl;
printf("%.7lf",ans);
}
signed main()
{
ios::sync_with_stdio(false); cin.tie(0); cout.tie(0);
solve();
}
回复
共 1 条回复,欢迎继续交流。
正在加载回复...