1 solutions
-
0
#include<bits/stdc++.h> using namespace std; const int N=500010,M=50010; int h[N],e[M],wt[M],ne[M],idx,n,cnt[N]; bool st[N]; double dist[N]; int change(string s) { // cout<<s<<"\n"; return (int(s[0]-'a')*26)+(int(s[1]-'a'))+1; } void add(int a,int b,int c) { // cout<<a<<" "<<b<<" "<<c; e[idx]=b,ne[idx]=h[a],wt[idx]=c,h[a]=idx++; return; } bool check(double mid) { queue<int>q; // memset(dist,0,sizeof(dist)); memset(cnt,0,sizeof(cnt)); memset(st,false,sizeof(st)); for(int i=1;i<=676;i++) { q.push(i); st[i]=true; } int cou=0; while(q.size()) { int t=q.front(); q.pop(); st[t]=false; for(int i=h[t];i!=-1;i=ne[i]) { int j=e[i]; if(dist[j]<dist[t]-mid+wt[i]*1.0) { dist[j]=dist[t]-mid+wt[i]*1.0; cnt[j]=cnt[t]+1; if(cnt[j]>=700||++cou>10000) { return true; } if(!st[j]) { q.push(j); st[j]=true; } } } } return false; } int main() { while(cin>>n) { if(n==0) { break; } memset(h,-1,sizeof(h)); idx=0; for(int i=1;i<=n;i++) { string s; cin>>s; int c=s.size(); // cout<<s<<"\n"; string s1,s2; s1=s.substr(0,2),s2=s.substr(c-2,c); // cout<<s1<<" "<<s2<<"\n"; add(change(s1),change(s2),c); } if(!check(0)) { cout<<"No solution\n"; } else { double l=0.0,r=100000.0; while(r-l>1e-4) { double mid=(l+r)/2.0; if(check(mid)) { l=mid; } else { r=mid; } } cout<<fixed<<setprecision(2)<<r<<"\n"; } } return 0; }
- 1
Information
- ID
- 289
- Time
- 1000ms
- Memory
- 128MiB
- Difficulty
- 10
- Tags
- # Submissions
- 7
- Accepted
- 2
- Uploaded By