結果
問題 | No.1301 Strange Graph Shortest Path |
ユーザー |
![]() |
提出日時 | 2020-11-27 21:37:59 |
言語 | C++17 (gcc 13.3.0 + boost 1.87.0) |
結果 |
TLE
(最新)
AC
(最初)
|
実行時間 | - |
コード長 | 8,621 bytes |
コンパイル時間 | 3,019 ms |
コンパイル使用メモリ | 216,712 KB |
最終ジャッジ日時 | 2025-01-16 06:44:26 |
ジャッジサーバーID (参考情報) |
judge5 / judge2 |
(要ログイン)
ファイルパターン | 結果 |
---|---|
sample | AC * 2 |
other | AC * 32 TLE * 1 |
ソースコード
#pragma GCC optimize ("Ofast")#include<bits/stdc++.h>using namespace std;void*wmem;char memarr[96000000];template<class S, class T> inline S max_L(S a,T b){return a>=b?a:b;}template<class T> inline void walloc1d(T **arr, int x, void **mem = &wmem){static int skip[16] = {0, 15, 14, 13, 12, 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, 1};(*mem) = (void*)( ((char*)(*mem)) + skip[((unsigned long long)(*mem)) & 15] );(*arr)=(T*)(*mem);(*mem)=((*arr)+x);}template<class T> inline void walloc1d(T **arr, int x1, int x2, void **mem = &wmem){walloc1d(arr, x2-x1, mem);(*arr) -= x1;}inline int my_getchar_unlocked(){static char buf[1048576];static int s = 1048576;static int e = 1048576;if(s == e && e == 1048576){e = fread_unlocked(buf, 1, 1048576, stdin);s = 0;}if(s == e){return EOF;}return buf[s++];}inline void rd(int &x){int k;int m=0;x=0;for(;;){k = my_getchar_unlocked();if(k=='-'){m=1;break;}if('0'<=k&&k<='9'){x=k-'0';break;}}for(;;){k = my_getchar_unlocked();if(k<'0'||k>'9'){break;}x=x*10+k-'0';}if(m){x=-x;}}inline void rd(long long &x){int k;int m=0;x=0;for(;;){k = my_getchar_unlocked();if(k=='-'){m=1;break;}if('0'<=k&&k<='9'){x=k-'0';break;}}for(;;){k = my_getchar_unlocked();if(k<'0'||k>'9'){break;}x=x*10+k-'0';}if(m){x=-x;}}struct MY_WRITER{char buf[1048576];int s;int e;MY_WRITER(){s = 0;e = 1048576;}~MY_WRITER(){if(s){fwrite_unlocked(buf, 1, s, stdout);}}};MY_WRITER MY_WRITER_VAR;void my_putchar_unlocked(int a){if(MY_WRITER_VAR.s == MY_WRITER_VAR.e){fwrite_unlocked(MY_WRITER_VAR.buf, 1, MY_WRITER_VAR.s, stdout);MY_WRITER_VAR.s = 0;}MY_WRITER_VAR.buf[MY_WRITER_VAR.s++] = a;}inline void wt_L(char a){my_putchar_unlocked(a);}inline void wt_L(long long x){int s=0;int m=0;char f[20];if(x<0){m=1;x=-x;}while(x){f[s++]=x%10;x/=10;}if(!s){f[s++]=0;}if(m){my_putchar_unlocked('-');}while(s--){my_putchar_unlocked(f[s]+'0');}}template<class S, class T> inline S chmin(S &a, T b){if(a>b){a=b;}return a;}template <class T> struct LHeap{int*hp;int*place;int size;T*val;void malloc(int N){hp = (int*)std::malloc(N*sizeof(int));place=(int*)std::malloc(N*sizeof(int));val=(T*)std::malloc(N*sizeof(T));}void malloc(int N, int ini){hp = (int*)std::malloc(N*sizeof(int));place=(int*)std::malloc(N*sizeof(int));val=(T*)std::malloc(N*sizeof(T));if(ini){init(N);}}void walloc(int N, void **mem=&wmem){walloc1d(&hp, N, mem);walloc1d(&place, N, mem);walloc1d(&val, N, mem);}void walloc(int N, int ini, void **mem=&wmem){walloc1d(&hp, N, mem);walloc1d(&place, N, mem);walloc1d(&val, N, mem);if(ini){init(N);}}void free(){std::free(hp);std::free(place);std::free(val);}void init(int N){int i;size=0;for(i=(0);i<(N);i++){place[i]=-1;}}void up(int n){int m;while(n){m=(n-1)/2;if(val[hp[m]]<=val[hp[n]]){break;}swap(hp[m],hp[n]);swap(place[hp[m]],place[hp[n]]);n=m;}}void down(int n){int m;for(;;){m=2*n+1;if(m>=size){break;}if(m+1<size&&val[hp[m]]>val[hp[m+1]]){m++;}if(val[hp[m]]>=val[hp[n]]){break;}swap(hp[m],hp[n]);swap(place[hp[m]],place[hp[n]]);n=m;}}void change(int n, T v){T f = val[n];val[n] = v;if(place[n]==-1){place[n] = size;hp[size++] = n;up(place[n]);}else{if(f < v){down(place[n]);}else if(f > v){up(place[n]);}}}int pop(void){int res = hp[0];place[res] = -1;size--;if(size){hp[0]=hp[size];place[hp[0]]=0;down(0);}return res;}};template<class FT, class CT> struct minCostFlow{int node;int*es;int*emem;int**edge;int**rev;FT**flow;FT eps;CT**cost;LHeap<CT> hp;char*reached;FT*cur_flow;CT*cur_cost;int*back_edge;void malloc(int N){int i;es = (int*)std::malloc(N*sizeof(int));emem = (int*)std::malloc(N*sizeof(int));edge = (int**)std::malloc(N*sizeof(int*));rev = (int**)std::malloc(N*sizeof(int*));flow = (FT**)std::malloc(N*sizeof(FT*));cost = (CT**)std::malloc(N*sizeof(CT*));for(i=(0);i<(N);i++){emem[i] = 0;edge[i] = rev[i] = NULL;flow[i] = NULL;cost[i] = NULL;}hp.malloc(N);reached = (char*)std::malloc(N*sizeof(char));cur_flow = (FT*)std::malloc(N*sizeof(FT));cur_cost = (CT*)std::malloc(N*sizeof(CT));back_edge = (int*)std::malloc(N*sizeof(int));node = N;for(i=(0);i<(N);i++){es[i] = 0;}eps = (FT)1e-9;}void init(int N){int i;node = N;for(i=(0);i<(N);i++){es[i] = 0;}eps = (FT)1e-9;}void memoryExpand(int i, int sz){if(sz <= emem[i]){return;}sz =max_L(max_L(sz, 3), 2*emem[i]);emem[i] = sz;edge[i] = (int*)realloc(edge[i], sz*sizeof(int));rev[i] = (int*)realloc(rev[i], sz*sizeof(int));flow[i] = (FT*)realloc(flow[i], sz*sizeof(FT));cost[i] = (CT*)realloc(cost[i], sz*sizeof(CT));}void addEdge(int n1, int n2, FT f, CT c){int s1 = es[n1]++;int s2 = es[n2]++;if(s1 >= emem[n1]){memoryExpand(n1, es[n1]);}if(s2 >= emem[n2]){memoryExpand(n2, es[n2]);}edge[n1][s1] = n2;edge[n2][s2] = n1;rev[n1][s1] = s2;rev[n2][s2] = s1;flow[n1][s1] = f;flow[n2][s2] = 0;cost[n1][s1] = c;cost[n2][s2] = -c;}template<class FTS, class CTS> void solve(int st, int ed, FTS &fres, CTS &cres, FT flim = -1){int i;int j;int k;FT f;fres = 0;cres = 0;while(flim!=0){hp.init(node);for(i=(0);i<(node);i++){reached[i] = 0;}reached[st] = 1;cur_cost[st] = 0;hp.change(st, cur_cost[st]);while(hp.size){i = hp.pop();for(j=(0);j<(es[i]);j++){if(flow[i][j] <= eps){continue;}k = edge[i][j];if(reached[k]==0 || cur_cost[k] > cur_cost[i]+cost[i][j]+eps){reached[k] = 1;cur_cost[k] = cur_cost[i] + cost[i][j];cur_flow[k] = flow[i][j];if(i!=st){chmin(cur_flow[k], cur_flow[i]);}back_edge[k] = rev[i][j];hp.change(k, cur_cost[k]);}}}if(reached[ed]==0){break;}if(flim==-2 && cur_cost[ed] > 0){break;}f = cur_flow[ed];if(flim != -1 && flim != -2){chmin(f, flim);flim -= f;}if(f < eps){break;}fres += f;cres += f * cur_cost[ed];i = ed;while(i != st){j = back_edge[i];k = edge[i][j];flow[i][j] += f;flow[k][rev[i][j]] -= f;i = k;}}}};int N;int M;int A[100000];int B[100000];long long C[100000];long long D[100000];int main(){int i;wmem = memarr;int f;long long c;minCostFlow<int,long long> flow;rd(N);rd(M);{int Lj4PdHRW;for(Lj4PdHRW=(0);Lj4PdHRW<(M);Lj4PdHRW++){rd(A[Lj4PdHRW]);A[Lj4PdHRW] += (-1);rd(B[Lj4PdHRW]);B[Lj4PdHRW] += (-1);rd(C[Lj4PdHRW]);rd(D[Lj4PdHRW]);}}flow.malloc(N);flow.init(N);for(i=(0);i<(M);i++){flow.addEdge(A[i], B[i], 1, C[i]);flow.addEdge(B[i], A[i], 1, C[i]);flow.addEdge(A[i], B[i], 1, D[i]);flow.addEdge(B[i], A[i], 1, D[i]);}flow.solve(0, N-1, f, c, 2);wt_L(c);wt_L('\n');return 0;}// cLay version 20201123-1// --- original code ---// int N, M, A[1d5], B[1d5]; ll C[1d5], D[1d5];// {// int f; ll c;// minCostFlow<int,ll> flow;// rd(N,M,(A--,B--,C,D)(M));// flow.malloc(N);// flow.init(N);// rep(i,M){// flow.addEdge(A[i], B[i], 1, C[i]);// flow.addEdge(B[i], A[i], 1, C[i]);// flow.addEdge(A[i], B[i], 1, D[i]);// flow.addEdge(B[i], A[i], 1, D[i]);// }// flow.solve(0, N-1, f, c, 2);// wt(c);// }