sgu 236 輸出負環迴路 367頁

2021-06-22 19:58:40 字數 962 閱讀 6971

題意:給出乙個有向圖,每條邊有乙個權值和時間花費。如果圖中無環,輸出0,如果有環,找出乙個最大的環,最大的意思是環上的權和 / 時間和 最大。

如果存在負環,那麼就是原式 tot(time)*k - tot(cost) < 0 成立,找到了乙個解,那麼就可以試著把k調大,因為我們要tot(cost) / tot(time) 最大,這樣就是乙個二分答案的過程

const  int  maxn = 58 ;

int m , n ;

struct edge

}e[maxn * maxn] ;

const double inf = 1e10 ;

const double eps = 1e-10 ;

vector< pair> lis[maxn] ;

double dist[maxn] ;

int father[maxn] ;

bool in[maxn] ;

int cnt[maxn] ;

int judge(double x)}}

}return 0 ;

}int main()

else r = mid ;

}int u = judge(s) ;

if(u == 0)

memset(cnt , 0 , sizeof(cnt)) ;

vectorans ; ans.clear() ;

while(cnt[u] <= 1)

printf("%d\n" , ans.size()) ;

printf("%d" , ans[ans.size()-1]) ;

for(i = ans.size() -2 ; i >= 0 ; i--) printf(" %d",ans[i]) ;

puts("") ;

}return 0 ;

}