OK seems nobody has idea on this problem, now I would like to post my code here and seek for any help, thanks
Code: Select all
#include<cstdio>
#include<cstring>
#include<vector>
using namespace std;
struct Edge{
int u, v;
double w;
Edge(){u=v=0;w=0;}
Edge(int a, int b, double c){ u=a;v=b;w=c; }
};
vector<Edge> E;
int death[100], vis[100], death_time, C[100][100], CT[100][100], G[1000][100], Gv[1000], g, n, m;
double W[100][100], d[101][100];
vector<Edge> GEdge[1000];
int Gn[1000][100];
void dfs(int v){
vis[v] = 1;
for (int i = 0 ; i < n ; ++i)
if (!vis[i]&&CT[v][i])
dfs(i);
death[death_time++] = v;
}
void rdfs(int v){
G[g][Gv[g]++] = v;
Gn[g][v] = 1;
vis[v]=1;
for (int i = n-1 ; i >= 0 ; --i)
if (C[v][death[i]]&&!vis[death[i]])
rdfs(death[i]);
}
int min(int a, int b){ return a>b?b:a;}
double max(double a, double b){ return a<b-1e-8?b:a;}
double fmin(double a, double b){ return a-1e-8>b?b:a;}
int main(){
int T, nc=0;
scanf("%d", &T);
while (T--){
printf("Case #%d: ", ++nc);
scanf("%d%d", &n, &m);
memset(C, 0, sizeof(C));
memset(CT, 0, sizeof(CT));
memset(G, 0, sizeof(G));
memset(Gv, 0, sizeof(Gv));
memset(Gn, 0, sizeof(Gn));
E.clear();
for (int i = 0 ; i < m ; ++i){
int a, b;
double c;
scanf("%d%d%lf", &a, &b, &c);
E.push_back(Edge(--a, --b, c));
C[a][b] = 1;
CT[b][a] = 1;
}
memset(death, 0, sizeof(death));
memset(vis, 0, sizeof(vis));
death_time=0;
for (int i = 0 ; i < n; ++i) //Calculate Death Time
if (!vis[i])
dfs(i);
memset(vis, 0, sizeof(vis));
g = 0;
for (int i = n-1 ; i >= 0 ; --i) //Construct all SCC
if (!vis[death[i]]){
rdfs(death[i]);
if (Gv[g]==1){ Gv[g] = 0; continue; }
GEdge[g].clear();
for (vector<Edge>::iterator t = E.begin(); t!=E.end();++t)
if (Gn[g][t->u] && Gn[g][t->v]){
GEdge[g].push_back(*t);
}
g++;
}
if (!g){ printf("No cycle found.\n"); continue;}
double ANS = 1e9;
for (int i = 0 ; i < g; ++i){
int s = G[i][0], V=Gv[i];
for (int k = 0 ; k <= n ; ++k)
for (int j = 0 ; j < n; ++j)
d[k][j] = 1000000001;
d[0][s] = 0;
for (int k = 1 ; k <= V ; ++k)
for (vector<Edge>::iterator e = GEdge[i].begin(); e != GEdge[i].end(); ++e){
if (d[k][e->v]-1e-8 > d[k-1][e->u]+e->w){
d[k][e->v] = fmin(d[k][e->v], d[k-1][e->u] + e->w);
}
}
for (int x = 0 ; x < V; ++x){
int nv = G[i][x];
double cANS = -1;
for (int y = 0 ; y < V; ++y)
cANS = max(cANS, 1.*(d[V][nv] - d[y][nv])/(V-y));
ANS = fmin(cANS, ANS);
}
}
printf("%.2lf\n", ANS-1e-4);
}
return 0;
}
Solving problem is a no easy task...