给定一一个n个点m条边的加权有向图, 平均值最小的回路。
二分答案,对于每个二分的mid 做一次Bellman-Fprd , 假设有k条边组成的回路。 回路上各条边的权值为 w1 , w2 ..wk ,
那么平均值小于mid意味着w1+w2+w3..+wk< k*mid 即:
(w1 - min)+(w2-mid)+...+(w2-mid)<0;
也就是说 这k条边能组成 一个负环,用 Bellman_Ford 来检查
1 #include2 #include 3 #include 4 #include 5 #include 6 #include 7 #include 8 using namespace std; 9 const int maxn = 55; 10 int cmp(double a ,double b){ 11 if(fabs(a-b)<=0.00000001) return 0; 12 return a-b>0?1:-1; 13 } 14 struct Edge{ 15 int from,to; 16 double dist; 17 }; 18 struct BellmanFord{ 19 int n,m; 20 vector edges; 21 vector G[maxn]; 22 bool inq[maxn]; 23 double d[maxn]; 24 int p[maxn]; 25 int cnt[maxn]; 26 void inti(int n){ 27 m=0; 28 this->n = n; 29 for(int i=0; i