結果

問題 No.1320 Two Type Min Cost Cycle
ユーザー vjudge1
提出日時 2025-10-02 20:07:15
言語 C++23
(gcc 13.3.0 + boost 1.87.0)
結果
AC  
実行時間 233 ms / 2,000 ms
コード長 2,056 bytes
コンパイル時間 3,695 ms
コンパイル使用メモリ 284,152 KB
実行使用メモリ 35,212 KB
最終ジャッジ日時 2025-10-02 20:07:23
合計ジャッジ時間 7,854 ms
ジャッジサーバーID
(参考情報)
judge5 / judge3
このコードへのチャレンジ
(要ログイン)
ファイルパターン 結果
sample AC * 3
other AC * 57
権限があれば一括ダウンロードができます

ソースコード

diff #

#include<bits/stdc++.h>
#define int long long
using namespace std;
const int N=2010;
const int INF=1e18;
struct edge{int v,w;};
vector<edge>e[N];
int T,n,m;
int dis[N],ans,pre[N],st[N];
bool vis[N];
int d[N][N];
struct Edge{
    int u,v,w;
}E[N];
struct node{
    int dis,id;
    bool operator<(const node &o)const{return dis>o.dis;}
};
void dij(int s){
    priority_queue<node>q;
    for(int i=1;i<=n;++i)dis[i]=INF,vis[i]=0,pre[i]=i,st[i]=i;
    dis[s]=0;q.push({dis[s],s});
    while(!q.empty()){
        int u=q.top().id;q.pop();
        if(vis[u])continue;vis[u]=1;
        for(auto i:e[u]){
            int v=i.v,w=i.w;
            if(dis[v]>dis[u]+w){
                dis[v]=dis[u]+w;
                if(!vis[v]){
                    pre[v]=u;
                    if(pre[v]==s)st[v]=v;
                    else st[v]=st[u];
                    q.push({dis[v],v});
                }
            }
        }
    }
}
signed main(){
    ios::sync_with_stdio(false);cin.tie(0),cout.tie(0);
    cin>>T>>n>>m;
    for(int i=1;i<=m;++i){
        int u,v,w;cin>>u>>v>>w;
        E[i]={u,v,w};
        e[u].push_back({v,w});
        if(!T){
            e[v].push_back({u,w});
        }
    }
    
    if(T){
        ans=INF;
        for(int r=1;r<=n;++r){
            dij(r);
            for(int i=1;i<=n;++i)d[r][i]=dis[i];
        }
        for(int i=1;i<=m;++i){
            int u=E[i].u,v=E[i].v,w=E[i].w;
            ans=min(ans,d[v][u]+w);
        }
        if(ans>=INF)cout<<-1<<'\n';
        else cout<<ans<<'\n';
        return 0;
    }
    ans=INF;
    for(int r=1;r<=n;++r){
        dij(r);
        for(int i=1;i<=m;++i){
            int u=E[i].u,v=E[i].v,w=E[i].w;
            if(pre[u]==v || pre[v]==u)continue;
            if(u!=r && v!=r){
                if(st[u]==st[v])continue;
                ans=min(ans,dis[u]+dis[v]+w);
                continue;
            }
            if(v==r)swap(u,v);
            if(st[v]==v)continue;
            ans=min(ans,dis[v]+w);
        }
    }
    if(ans>=INF)ans=-1;
    cout<<ans<<'\n';
    return 0;
}
0