結果
| 問題 | 
                            No.1320 Two Type Min Cost Cycle
                             | 
                    
| コンテスト | |
| ユーザー | 
                             vjudge1
                         | 
                    
| 提出日時 | 2025-10-02 20:07:48 | 
| 言語 | C++23  (gcc 13.3.0 + boost 1.87.0)  | 
                    
| 結果 | 
                             
                                AC
                                 
                             
                            
                         | 
                    
| 実行時間 | 230 ms / 2,000 ms | 
| コード長 | 2,058 bytes | 
| コンパイル時間 | 2,819 ms | 
| コンパイル使用メモリ | 283,900 KB | 
| 実行使用メモリ | 35,164 KB | 
| 最終ジャッジ日時 | 2025-10-02 20:07:55 | 
| 合計ジャッジ時間 | 6,655 ms | 
| 
                            ジャッジサーバーID (参考情報)  | 
                        judge1 / judge5 | 
(要ログイン)
| ファイルパターン | 結果 | 
|---|---|
| sample | AC * 3 | 
| other | AC * 57 | 
ソースコード
#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;
}//
            
            
            
        
            
vjudge1