3852. 【NOIP2014八校联考第2场第2试9.28】单词接龙(

Description

Bsny从字典挑出N个单词,并设计了接龙游戏,只要一个单词的最后两个字母和另一个单词的前两个字母相同,那么这两个单词就可以有序的连接起来。
Bsny想要知道在所给的所有单词中能否按照上述方式接龙组成一个单词环(可能是多个),若能,求所有环的环中单词平均长度最大值。

Input

第一行一个整数N,表示单词数量。
接下来N行,每行一个字符串,仅包含小写字母。

Output

若能组成单词环,输出环中单词的最大平均长度,结果保留2位小数;否则输出"No solution."(不包括双引号)。精度误差在0.01都算正确。

Sample Input

3
intercommunicational
alkylbenzenesulfonate
tetraiodophenolphthalein

Sample Output

21.67

Data Constraint

20%的数据:n≤20;
70%的数据:n≤1000;
100%的数据:n≤100000,每个单词长度不超过1000。输入数据比较大,C/C++的同学用scanf输入。

Solution

100 分做法:二分+SPFA 判环 单词看成边,两个字母组合看成点。这样,庞大的输入数据就变成了一个点 数至多为 262的有向图。 接下来就是在有向图上找平均边长最大的环。可以用二分答案。二分一个 len,将所有边权都减去 len,若图中存在正权环,那么 len 可以增大,否则就减 小。直到找到答案。 判断是否存在环,用 SPFA,检查某个点入队次数,超过总点数即存在环。

Code

#include<cstdio>
#include<algorithm>
#include<cstring>
#define I int
#define ld long double
#define F(i,a,b) for(register I i=a;i<=b;i++)
#define Fd(i,a,b) for(register I i=a;i>=b;i--)
#define mem(a,b) memset(a,b,sizeof a)
#define N 300010
using namespace std;
void rd(I &x){
	x=0;I w=1;
	char ch=getchar();
	while(ch<'0'||ch>'9'){if(ch=='-') w=-1;ch=getchar();}
	while(ch>='0'&&ch<='9'){x=x*10+ch-'0';ch=getchar();}
	x*=w;
}
I n,len,t[N],nx[N],ls[800],bz[800],tm[800],d[N],tot,ok;
char s[1010];
ld w[N],f[800];
void add(I x,I y,ld z){t[++tot]=y,nx[tot]=ls[x],ls[x]=tot,w[tot]=z;}
I get(char x,char y){return (I)(x-'a'+1)*27+(I)(y-'a'+1);}
void spfa(I x,ld mid){
	if(ok) return;
	bz[x]=1;
	for(I k=ls[x];k;k=nx[k]) if(!ok){
		I y=t[k];
		if(f[y]<f[x]+w[k]-mid){
			f[y]=f[x]+w[k]-mid;
			if(bz[y]) return (void)(ok=1);
			spfa(y,mid);
		}
	}
	bz[x]=0;
}
I check(ld md){
	mem(f,0);
	mem(bz,0);
	ok=0;
	F(i,1,728){
		spfa(i,md);
		if(ok) return 1;
	}
	return 0;
}
I main(){
	scanf("%d\n",&n);
	ld l=0,r,mid,ans=0;
	F(i,1,n){
		scanf("%s",s+1);
		len=strlen(s+1);
		if(len>1) add(get(s[1],s[2]),get(s[len-1],s[len]),(ld)len);
	}
	r=1000;
	while(l<=r){
		mid=(l+r)/2;
		if(check(mid)) l=(ans=mid)+0.001;else r=mid-0.001;
	}
	if(!ans) printf("No solution.");else printf("%.2Lf\n",ans);
	return 0;
}
发布了199 篇原创文章 · 获赞 201 · 访问量 2万+

猜你喜欢

转载自blog.csdn.net/zsjzliziyang/article/details/104011804
今日推荐