LOJ WA on#1求hack
查看原帖
LOJ WA on#1求hack
578029
ivyjiao楼主2024/3/14 19:57

rt,用的不是dfs优化

#include<bits/stdc++.h>
#define fi first
#define se second
#define eps 1e-6
using namespace std;
int n,dis2[100001];
double dis[100001];
string s[100001];
vector<pair<int,int> >G[100001];
queue<int>q;
bool spfa(double s){
    while(q.size()) q.pop();
    memset(dis,0,sizeof dis);
    memset(dis2,0,sizeof dis2);
    for(int i=0;i<=700;i++) q.push(i);
    while(q.size()){
        int u=q.front();
        q.pop();
        for(int i=0;i<G[u].size();i++){
            if(dis[G[u][i].se]<dis[u]+G[u][i].fi-s){
                dis[G[u][i].se]=dis[u]+G[u][i].fi-s;
                dis2[G[u][i].se]=dis2[u]+1;
                if(dis2[G[u][i].se]>=700) return 1;
                q.push(G[u][i].se);
            }
        }
    }
    return 0;
}
int main(){
    while(cin>>n&&n){
        for(int i=1;i<=700;i++) G[i].clear(); 
        for(int i=1;i<=n;i++){
            cin>>s[i];
            if(s[i].size()>=2){
                int c1=(int)(s[i][0]-'a')*26+(int)(s[i][1]-'a'),c2=(int)(s[i][s[i].size()-2]-'a')*26+(int)(s[i][s[i].size()-1]-'a');
                G[c1].push_back({s[i].size(),c2});
            }
        }
        if(!spfa(0)){
            cout<<"No solution"<<endl;
            continue;
        }
        double l=0.0,r=1000.0;
        while(r-l>eps){
            double mid=(l+r)/2.0;
            if(spfa(mid)) l=mid;
            else r=mid;
        }
        cout<<l<<endl;
    }
}
2024/3/14 19:57
加载中...