这题题解都过不了,怎么调!
查看原帖
这题题解都过不了,怎么调!
401479
LuckiestShawn楼主2023/3/13 17:13

rt

#include <iostream>
#include <stdio.h>
#include <vector>
#include <bitset>
#include <deque>
#include <string.h>
using namespace std;
struct AB{
	char front[2],back[2];
	double len;
}str[100001];
string s;
deque <int> que;
vector <int> st[100001];
int n,kf,kb,to,w,ans;
double dis[100001];
int cnt[100001];
bitset <100001> inque;
double l,r,mid;
bool spfa(int x,double v)
{
	inque[x] = 1;
	for(int i=0;i<st[x].size();i++)
	{
		to = st[x][i];
		if(dis[to]<dis[x]+str[st[x][i]].len-v)
		{
			dis[to] = dis[x]+str[st[x][i]].len-v;
			if(inque[to])
				return true;
			else if(spfa(to,v))
				return true;
		}
	}
	inque[x] = 0;
	return false;
}
bool check()
{
	inque.reset();
	for(int i=1;i<=n;i++)
		dis[i] = 0;
	for(int i=1;i<=n;i++)
		if(spfa(i,mid))
			return true;
	return false;
}
int main()
{
	while(scanf("%d",&n)!=EOF)
	{
		if(n==0)
			break;
		for(int i=1;i<=n;i++)
		{
			cin >> s;
			if(s.size()==1)
				continue;
			str[i].front[0] = s[0];
			str[i].front[1] = s[1];
			str[i].back[0] = s[s.size()-2];
			str[i].back[1] = s[s.size()-1];
			str[i].len = s.size();
		}
		for(int i=1;i<=n;i++)
		{
			for(int j=1;j<=n;j++)
			{
				kb = (str[i].back[0]-'a')*26+(str[i].back[1]-'a');
				kf = (str[j].front[0]-'a')*26+(str[j].front[1]-'a');
				if(kb==kf)
					st[i].push_back(j);
			}
		}
		l = 0;
		r = 10005;
		while(r-l>0.001)
		{
			mid = (r+l)/2;
			if(check())
				l = mid;
			else
				r = mid;
		}
		if(l<0.001)
			printf("No solution.");
		else
			printf("%lf\n",l);
		for(int i=1;i<=n;i++)
			while(!st[i].empty())
				st[i].pop_back();
	}
	return 0;
}
2023/3/13 17:13
加载中...