【ybtoj】【Hash】最大分离度

题意

image

题解

很水的题啊。
不难想到对于每一个人当作点连边,如果一个人第一次出现就新建一个点。
然后求出每两个点之间的最短路,取最大值,特判是否不连通。
判断一个人是否出现过可以用 Hash,但是感觉 Hash 之后还要开 map 记录数值,干脆直接开map<string,int>.
所以为什么有这篇题解?因为我求最短路的第一想法居然是对每一个点跑一遍 BFS。虽然复杂度上没错但是略复杂。
实际上,直接跑 Floyd 即可,这篇题解纯是为了提醒自己 Floyd 这玩意的。

代码

#include<bits/stdc++.h>
using namespace std;
#define ll long long
const int INF = 0x3f3f3f3f,N = 55;
inline ll read()
{
	ll ret=0;char ch=' ',c=getchar();
	while(!(c>='0'&&c<='9')) ch=c,c=getchar();
	while(c>='0'&&c<='9') ret=(ret<<1)+(ret<<3)+c-'0',c=getchar();
	return ch=='-'?-ret:ret;
}
int p,r;
int f[N][N],cnt;
char s1[55],s2[55];
map<string,int> mp;
inline void init()
{
	mp.clear();
	cnt=0;
	memset(f,0x3f,sizeof(f)); 
}
int T;
int main()
{
	p=read(),r=read();
	while(p||r)
	{
		T++;
		init();
		for(int i=1;i<=r;i++) 
		{
			scanf("%s%s",s1+1,s2+1);
			if(!mp[s1+1]) mp[s1+1]=++cnt;
			if(!mp[s2+1]) mp[s2+1]=++cnt;
			f[mp[s2+1]][mp[s1+1]]=f[mp[s1+1]][mp[s2+1]]=1;
		}
		for(int k=1;k<=p;k++) 
			for(int i=1;i<=p;i++) 
				for(int j=1;j<=p;j++)
					f[i][j]=min(f[i][j],f[i][k]+f[k][j]);
		int ans=0;
		for(int i=1;i<=p;i++)
		 	for(int j=1;j<=p;j++)
		 		if(i!=j) ans=max(ans,f[i][j]);
		if(ans==INF) printf("Network %d: DISCONNECTED
",T);
		else  printf("Network %d: %d
",T,ans);
		p=read(),r=read();
	}
	return 0;
}
原文地址:https://www.cnblogs.com/conprour/p/15303564.html