結果

問題 No.3669 误差绝不允许
コンテスト
ユーザー harurun
提出日時 2026-08-06 17:20:43
言語 C++23(gcc16)
(gcc 16.1.0 + boost 1.92.0)
コンパイル:
g++-16 -O2 -lm -std=c++23 -Wuninitialized -DONLINE_JUDGE -o a.out _filename_
実行:
./a.out
結果
AC  
実行時間 924 ms / 3,000 ms
+ 348µs
コード長 1,451 bytes
記録
記録タグの例:
初AC ショートコード 純ショートコード 純主流ショートコード 最速実行時間
コンパイル時間 7,018 ms
コンパイル使用メモリ 635,268 KB
実行使用メモリ 26,440 KB
最終ジャッジ日時 2026-09-04 22:08:32
合計ジャッジ時間 15,526 ms
ジャッジサーバーID
(参考情報)
judge1_0 / judge3_1
このコードへのチャレンジ
(要ログイン)
ファイルパターン 結果
sample AC * 2
other AC * 30
権限があれば一括ダウンロードができます

ソースコード

diff #
raw source code

#include <bits/stdc++.h>
using namespace std;
#include <boost/multiprecision/cpp_int.hpp>
using cpp_int=boost::multiprecision::cpp_int;

cpp_int Biggcd(cpp_int x, cpp_int y){
    if(y>0)return Biggcd(y,x%y);
    return x;
}

cpp_int Biglcm(cpp_int x, cpp_int y){
    return x/Biggcd(x,y)*y;
}

struct edge{
    int u,v,a,b;
};

int main(){
    int N,M;
    cin>>N>>M;
    vector<edge> edges(M);
    cpp_int l=1;
    for(int i=0;i<M;i++){
        cin>>edges[i].u>>edges[i].v>>edges[i].a>>edges[i].b;
        edges[i].u--;
        edges[i].v--;
        l=Biglcm(edges[i].b,l);
    }
    vector<vector<pair<int, cpp_int>>> G(N);
    cpp_int INF=1;
    for(int i=0;i<M;i++){
        const cpp_int c=edges[i].a*l/edges[i].b;
        G[edges[i].u].push_back({edges[i].v, c});
        G[edges[i].v].push_back({edges[i].u, c});
        INF+=c;
    }
    priority_queue<pair<cpp_int,int>, vector<pair<cpp_int,int>>, greater<pair<cpp_int, int>>> que;
    que.push({cpp_int(0),0});
    vector<cpp_int> ans(N, INF);
    ans[0]=0;
    while(!que.empty()){
        auto [c,now]=que.top();
        que.pop();
        if(ans[now]<c){
            continue;
        }
        for(const auto& [to,cost]: G[now]){
            if(ans[to]>ans[now]+cost){
                ans[to]=ans[now]+cost;
                que.push({ans[to],to});
            }
        }
    }
    for(int i=1;i<N;i++){
        cpp_int g=Biggcd(ans[i],l);
        cout<<ans[i]/g<<" "<<l/g<<"\n";
    }
}
0