poj 2949
#include<iostream>
#include<fstream>
using namespace std;
int n;
struct e{
int s,t;
double w;
};
e edge[100001];
char c[1002];
int mid;
int top;
void add(int s,int t,int w){
edge[++top].s=s;
edge[top].t=t;
edge[top].w=w;
}
double d[27*27];
int solve(){
int i,j,k;
for(i=1;i<=26*26;i++)
d[i]=-1000000000;
for(i=1;i<=26*26;i++)
{
k=0;
for(j=1;j<=n;j++)
if(d[edge[j].s]+edge[j].w-(double)mid/100>d[edge[j].t])
{
d[edge[j].t]=d[edge[j].s]+edge[j].w-(double)mid/100;
k=1;
}
if(k==0) return 0;
}
for(j=1;j<=n;j++)
if(d[edge[j].s]+edge[j].w-(double)mid/100>d[edge[j].t])
return 1;
return 0;
}
void read(){
// ifstream cin("in.txt");
int i,j,k;
int m;
while(scanf("%d",&n)!=EOF)
{
if(n==0) return ;
m=0;top=0;
for(i=1;i<=n;i++)
{
// cin>>c;
scanf("%s",c);
k=strlen(c);
m=max(m,k);
add((c[0]-'a')*26+(c[1]-'a'+1),(c[strlen(c)-2]-'a')*26+(c[strlen(c)-1]-'a'+1),strlen(c));
}
i=0;j=m*100;
while(i<=j)
{
mid=(i+j)>>1;
if(solve()) i=mid+1;
else
j=mid-1;
}
if(i==0) cout<<"No solution."<<endl;
else
printf("%.2lf\n",(double)j/100);
}
}
int main(){
read();
return 0;
}
#include<fstream>
using namespace std;
int n;
struct e{
int s,t;
double w;
};
e edge[100001];
char c[1002];
int mid;
int top;
void add(int s,int t,int w){
edge[++top].s=s;
edge[top].t=t;
edge[top].w=w;
}
double d[27*27];
int solve(){
int i,j,k;
for(i=1;i<=26*26;i++)
d[i]=-1000000000;
for(i=1;i<=26*26;i++)
{
k=0;
for(j=1;j<=n;j++)
if(d[edge[j].s]+edge[j].w-(double)mid/100>d[edge[j].t])
{
d[edge[j].t]=d[edge[j].s]+edge[j].w-(double)mid/100;
k=1;
}
if(k==0) return 0;
}
for(j=1;j<=n;j++)
if(d[edge[j].s]+edge[j].w-(double)mid/100>d[edge[j].t])
return 1;
return 0;
}
void read(){
// ifstream cin("in.txt");
int i,j,k;
int m;
while(scanf("%d",&n)!=EOF)
{
if(n==0) return ;
m=0;top=0;
for(i=1;i<=n;i++)
{
// cin>>c;
scanf("%s",c);
k=strlen(c);
m=max(m,k);
add((c[0]-'a')*26+(c[1]-'a'+1),(c[strlen(c)-2]-'a')*26+(c[strlen(c)-1]-'a'+1),strlen(c));
}
i=0;j=m*100;
while(i<=j)
{
mid=(i+j)>>1;
if(solve()) i=mid+1;
else
j=mid-1;
}
if(i==0) cout<<"No solution."<<endl;
else
printf("%.2lf\n",(double)j/100);
}
}
int main(){
read();
return 0;
}