社区讨论

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 条回复,欢迎继续交流。

正在加载回复...