結果
問題 | No.468 役に立つ競技プログラミング実践編 |
ユーザー |
![]() |
提出日時 | 2016-12-18 00:35:44 |
言語 | C++14 (gcc 13.3.0 + boost 1.87.0) |
結果 |
AC
|
実行時間 | 343 ms / 2,000 ms |
コード長 | 3,263 bytes |
コンパイル時間 | 1,093 ms |
コンパイル使用メモリ | 98,576 KB |
実行使用メモリ | 24,320 KB |
最終ジャッジ日時 | 2024-12-14 07:16:46 |
合計ジャッジ時間 | 6,419 ms |
ジャッジサーバーID (参考情報) |
judge4 / judge2 |
(要ログイン)
ファイルパターン | 結果 |
---|---|
sample | AC * 31 |
other | AC * 6 |
ソースコード
// #includes {{{#include <algorithm>#include <numeric>#include <iostream>#include <string>#include <vector>#include <queue>#include <list>#include <deque>#include <stack>#include <set>#include <map>#include <cstdio>#include <cstdlib>#include <cassert>#include <cstring>#include <cmath>using namespace std;// }}}// pre-written code {{{#define REP(i,n) for(int i=0;i<(int)(n);++i)#define RREP(i,a,b) for(int i=(int)(a);i<(int)(b);++i)#define FOR(i,c) for(__typeof((c).begin()) i=(c).begin();i!=(c).end();++i)#define LET(x,a) __typeof(a) x(a)//#define IFOR(i,it,c) for(__typeof((c).begin())it=(c).begin();it!=(c).end();++it,++i)#define ALL(c) (c).begin(), (c).end()#define MP make_pair#define EXIST(e,s) ((s).find(e)!=(s).end())#define RESET(a) memset((a),0,sizeof(a))#define SET(a) memset((a),-1,sizeof(a))#define PB push_back#define DEC(it,command) __typeof(command) it=command//debug#define dump(x) cerr << #x << " = " << (x) << endl;#define debug(x) cerr << #x << " = " << (x) << " (L" << __LINE__ << ")" << " " << __FILE__ << endl;#define debug2(x) cerr << #x << " = [";REP(__ind,(x).size()){cerr << (x)[__ind] << ", ";}cerr << "] (L" << __LINE__ << ")" << endl;const int INF=0x3f3f3f3f;typedef long long Int;typedef unsigned long long uInt;#ifdef __MINGW32__typedef double rn;#elsetypedef long double rn;#endiftypedef pair<int,int> pii;/*#ifdef MYDEBUG#include"debug.h"#include"print.h"#endif*/// }}}//{{{ Graphtypedef int Weight;struct Edge {int src, dst, rev;Weight weight;Edge(int src, int dst, Weight weight=1,int rev=-1) :src(src), dst(dst), weight(weight), rev(rev) { }};bool operator < (const Edge &e, const Edge &f) {return e.weight != f.weight ? e.weight > f.weight : // !!INVERSE!!e.src != f.src ? e.src < f.src : e.dst < f.dst;}typedef vector<Edge> Edges;typedef vector<Edges> Graph;typedef vector<Weight> Array;typedef vector<Array> Matrix;//add bi-directional edgevoid addBiEdge(Graph &g,int from ,int to, Weight w=1){while(g.size()<max(from,to)+1)g.push_back(Edges());g[from].push_back(Edge(from,to,w,g[to].size()));g[to].push_back(Edge(to,from,w,g[from].size()-1));}//add directional edgevoid addEdge(Graph &g,int from ,int to, Weight w=1){while(g.size()<from+1)g.push_back(Edges());g[from].push_back(Edge(from,to,w));}#ifdef DEBUG#include"graph/graphviz.h"#endif//}}}const int D = 100010;int N,M;Graph g,rev_g;int dist[D];int es[D],ef[D],lf[D],ls[D];int calc_es(int u){if(es[u]>=0)return es[u];int ans = 0;for(auto e:rev_g[u]){ans = max(ans,calc_es(e.dst)+e.weight);}return es[u]=ans;}int calc_ls(int u){if(ls[u]>=0)return ls[u];if(u==N-1)return ls[u] = es[u];int ans = 0x3f3f3f3f;for(auto e:g[u]){ans = min(ans,calc_ls(e.dst)-e.weight);}return ls[u] = ans;}int main(){cin>>N>>M;g.assign(N,Edges());rev_g.assign(N,Edges());memset(es,-1,sizeof(es));memset(ls,-1,sizeof(ls));REP(i,M){int A,B,C;cin>>A>>B>>C;addEdge(g,A,B,C);addEdge(rev_g,B,A,C);}calc_es(N-1);calc_ls(0);int ans = 0;REP(u,N){if(es[u]!=ls[u])ans++;}cout<<es[N-1]<<" "<<ans<<"/"<<N<<endl;/*REP(u,N)cerr<<es[u]<<" ";cerr<<endl;REP(u,N)cerr<<ls[u]<<" ";cerr<<endl;*/return 0;}