費用不再是相加,而是以概率形式出現,需要相乘
取對數可以將乘法變為加法
然後就是裸的費用流了
注意精度問題,不然會t。。。
#include #include #include #include #include #include #define inf 0x3f3f3f3f
#define eps 1e-8
using namespace std;
typedef long long ll;
typedef pairp;
const int maxv = 1e2 + 10;
int v;
struct edge
};double h[maxv];
double dist[maxv];
int prevv[maxv], preve[maxv];
vectorg[maxv];
void add_edge(int from, int to, int cap, double cost)
double min_cost_flow(int s, int t, int f)
}} for (int v = 0; v < v; v++) h[v] += dist[v];
int d = f;
for (int v = t; v != s; v = prevv[v])
res += d * h[t];
f -= d;
for (int v = t; v != s; v = prevv[v])
} return res;
}int main() else if (u < v)
} for (int i = 0; i < m; i++)
} double ans = min_cost_flow(s, t, f);
printf("%.2lf\n", 1.000 - pow(2, -ans));
} return 0;
}
hdu 4411 最小費用流
思路 這道題建圖比較難想,首先是建立超級源點和超級匯點,那麼由於有k個警察,於是vs與0連邊,容量為k,費用為0,因為這k個警察不一定都出去,也就是不一定是最大流,於是0和vt連邊,容量為k,費用為0。然後就是拆點建圖了 1 0到i連邊,容量為1,費用0到i的最短路,表示去抓城市i的小偷。2 從i到...
hdu 4411 最小費用流
思路 這道題建圖比較難想,首先是建立超級源點和超級匯點,那麼由於有k個警察,於是vs與0連邊,容量為k,費用為0,因為這k個警察不一定都出去,也就是不一定是最大流,於是0和vt連邊,容量為k,費用為0。然後就是拆點建圖了 1 0到i連邊,容量為1,費用0到i的最短路,表示去抓城市i的小偷。2 從i到...
HDU 2135 最小費用流
1 include2 include3 include4 include 5 define nmax 1002 6 define mmax 10005 7 define inf 99999999 8using namespace std 9int head nmax qu nmax dis nmax...