Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- /*
- The Great Template of Salazar Slytherin
- */
- #include <bits/stdc++.h>
- using namespace std;
- #define rep(i,n) for(i=0; i<n; i++)
- #define repl(i,n) for(i=1; i<=n; i++)
- #define sz(x) (int) x.size()
- #define pb push_back
- #define all(x) x.begin(),x.end()
- #define uu first
- #define vv second
- #define mem(x, y) memset(x, y, sizeof(x));
- #define sdi(x) scanf("%d", &x)
- #define sdii(x, y) scanf("%d %d", &x, &y)
- #define sdiii(x, y, z) scanf("%d %d %d", &x, &y, &z)
- #define sdl(x) scanf("%lld", &x)
- #define sdll(x, y) scanf("%lld %lld", &x, &y)
- #define sdlll(x, y, z) scanf("%lld %lld %lld", &x, &y, &z)
- #define sds(x) scanf("%s", x)
- #define pfi(x) printf("%d\n", x)
- #define pfii(x, y) printf("%d %d\n", x, y)
- #define pfiii(x, y, z) printf("%d %d %d\n", x, y, z)
- #define pfl(x) printf("%lld\n", x)
- #define pfll(x, y) printf("%lld %lld\n", x, y)
- #define pflll(x, y, z) printf("%lld %lld %lld\n", x, y, z)
- #define eps 1e-13
- #define OK printf("ok\n")
- #define DB(x) cout << #x << " = " << x << endl;
- /// Tanzir
- #define FRE(i,a,b) for(i = a; i <= b; i++)
- #define FRL(i,a,b) for(i = a; i < b; i++)
- #define un(x) x.erase(unique(all(x)), x.end())
- #define sf(n) scanf("%d", &n)
- #define sff(a,b) scanf("%d %d", &a, &b)
- #define sfff(a,b,c) scanf("%d %d %d", &a, &b, &c)
- #define sl(n) scanf("%lld", &n)
- #define sll(a,b) scanf("%lld %lld", &a, &b)
- #define slll(a,b,c) scanf("%lld %lld %lld", &a, &b, &c)
- #define D(x) cout<<#x " = "<<(x)<<endl
- #define DBG printf("Hi\n")
- #define PI acos(-1.00)
- #define xx first
- #define yy second
- typedef double db;
- typedef long long LL;
- typedef unsigned long long ULL;
- typedef pair <int, int> pii;
- typedef pair <long long , long long > pll;
- inline int setBit(int N, int pos) { return N=N | (1<<pos); }
- inline int resetBit(int N, int pos) { return N= N & ~(1<<pos); }
- inline bool checkBit(int N, int pos) { return (bool)(N & (1<<pos)); }
- //int kx[] = {+2, +1, -1, -2, -2, -1, +1, +2};
- //int ky[] = {+1, +2, +2, +1, -1, -2, -2, -1}; //Knight Direction
- //int fx[] = {+0, +0, +1, -1, -1, +1, -1, +1};
- //int fy[] = {-1, +1, +0, +0, +1, +1, -1, -1}; //Four & Eight Direction
- /// Zobayer vai's code
- const int MAXN = 105, MAXE = 500+505; // MAXE = twice the number of edges
- int src, snk, nNode, nEdge;
- LL Q[MAXN], fin[MAXN], pro[MAXN], dist[MAXN];
- LL flow[MAXE], cap[MAXE], nxt[MAXE], to[MAXE];
- const LL inf = 1e9;
- inline void init(int _src, int _snk, int _n)
- {
- src = _src, snk = _snk, nNode = _n, nEdge = 0;
- mem(fin, -1);
- }
- inline void add(int u, int v, LL _cap)
- {
- // D(_cap);
- to[nEdge] = v, cap[nEdge] = _cap, flow[nEdge] = 0, nxt[nEdge] = fin[u], fin[u] = nEdge++;
- to[nEdge] = u, cap[nEdge] = 0, flow[nEdge] = 0, nxt[nEdge] = fin[v], fin[v] = nEdge++; // for directed cap[nEdge]=0 here
- }
- bool bfs()
- {
- int st, en, i, u, v;
- mem(dist, -1);
- dist[src] = st = en = 0;
- Q[en++] = src;
- while(st < en)
- {
- u = Q[st++];
- for(i=fin[u]; i>=0; i=nxt[i])
- {
- v = to[i];
- if(flow[i] < cap[i] && dist[v]==-1)
- {
- dist[v] = dist[u]+1;
- Q[en++] = v;
- }
- }
- }
- return dist[snk]!=-1;
- }
- LL dfs(LL u, LL fl)
- {
- if(u==snk) return fl;
- for(LL &e=pro[u], v, df; e>=0; e=nxt[e])
- {
- v = to[e];
- if(flow[e] < cap[e] && dist[v]==dist[u]+1)
- {
- df = dfs(v, min(cap[e]-flow[e], fl));
- if(df>0)
- {
- flow[e] += df;
- flow[e^1] -= df;
- return df;
- }
- }
- }
- return 0;
- }
- LL dinitz() // 1-based indexing
- {
- LL ret = 0;
- LL df;
- while(bfs())
- {
- for(int i=1; i<=nNode; i++) pro[i] = fin[i];
- while(true)
- {
- df = dfs(src, inf);
- if(df) ret += df;
- else break;
- }
- }
- return ret;
- }
- struct edge{
- int u, v, c;
- };
- vector<edge> E;
- int n, m, x;
- bool ok(db mid)
- {
- // D(mid);
- int src = n+1;
- init(src,n,n+1);
- add(src,1,x);
- for(int i = 0; i<E.size(); i++)
- add(E[i].u,E[i].v,(E[i].c/mid)+eps);
- if(dinitz() == x)
- return true;
- return false;
- }
- int main()
- {
- // freopen("in.txt","r",stdin);
- // freopen("out.txt","w",stdout);
- int i, j, cs, t, u, v,c;
- sfff(n,m,x);
- FRE(i,1,m)
- {
- sfff(u,v,c);
- E.pb({u,v,c});
- }
- db lo = eps, hi = 2e6;
- // D(ok(1.0/x));return 0;
- // if(n == 50)
- // D(ok(4160084.5279072807));
- for(int i = 1; i<=400; i++)
- {
- db mid = (lo+hi)/2;
- if(ok(mid))
- lo = mid;
- else
- hi = mid;
- }
- printf("%.10f\n",x*lo);
- return 0;
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement