• ClueOJ
  • Trang chủ
  • Danh sách bài
  • Các bài nộp
  • Thành viên
    >
    • Tổ chức
  • Các kỳ thi
  • Tổng hợp đề thi
  • Thông tin
    >
    • Máy chấm
    • Discord
    • blog
  • Đăng ký tổ chức
VI EN Đăng nhập  hoặc  Đăng ký

duongbao1308

  • Thông tin
  • Thống kê
  • Blog

Số bài đã giải: 36
Hạng điểm: #286
Tổng điểm: 718,67
Đóng góp: 0

Xem các bài nộp

Từ HPC Online Judge

Thông tin

include <bits/stdc++.h>

using namespace std;

define file "renet"

define FILE if(fopen(file".inp","r")){freopen(file".inp","r",stdin);freopen(file".out","w",stdout);}

const long long INF = 1e18;

int main(){ ios::syncwithstdio(false); cin.tie(0); FILE int n,k,m,t; cin>>n>>k>>m>>t;

vector<int> special(k);
vector<int> isSpecial(n+1,0);

for(int i=0;i&lt;k;i++){
    cin>>special[i];
    isSpecial[special[i]]=1;
}

vector<vector<pair<int,int>>> g(n+1);

for(int i=0;i&lt;m;i++){
    int u,v,w;
    cin>>u>>v>>w;
    g[u].push_back({v,w});
    g[v].push_back({u,w});
}

vector<int> need;

if(t==1){
    need = special;
}else{
    for(int i=1;i<=n;i++)
        if(!isSpecial[i])
            need.push_back(i);
}

int K = need.size();
int FULL = 1<&lt;K;

vector&lt;vector<long long>> dp(FULL, vector&lt;long long>(n+1, INF));

for(int i=0;i&lt;K;i++)
    dp[1<&lt;i][need[i]] = 0;

for(int mask=1; mask&lt;FULL; mask++){

    for(int sub=(mask-1)&mask; sub; sub=(sub-1)&mask)
        for(int v=1; v<=n; v++)
            dp[mask][v] = min(dp[mask][v],
                              dp[sub][v] + dp[mask^sub][v]);

    priority_queue&lt;pair<long long,int>,
        vector&lt;pair<long long,int>>,
        greater&lt;pair<long long,int>>> pq;

    for(int v=1; v<=n; v++)
        if(dp[mask][v] < INF)
            pq.push({dp[mask][v],v});

    while(!pq.empty()){
        auto [d,u] = pq.top();
        pq.pop();

        if(d!=dp[mask][u]) continue;

        for(auto [v,w]:g[u])
            if(dp[mask][v] > d + w){
                dp[mask][v] = d + w;
                pq.push({dp[mask][v],v});
            }
    }
}

long long ans = INF;

for(int v=1; v<=n; v++)
    ans = min(ans, dp[FULL-1][v]);

cout<&lt;ans;

}

Huy hiệu

Người dùng này không có huy hiệu nào.

«    »
CN
T2
T3
T4
T5
T6
T7
Ít
Nhiều

dựa trên nền tảng DMOJ | theo dõi ClueOJ trên Discord và Facebook