제출 #310308

#제출 시각아이디문제언어결과실행 시간메모리
310308nicolaalexandraCities (BOI16_cities)C++14
74 / 100
6092 ms170584 KiB
#include <bits/stdc++.h>
#define DIM 100010
#define DIMBUFF 6000000
#define INF 2000000000000000000LL
using namespace std;

vector <pair<int,int> > L[DIM];
priority_queue <pair<long long,pair<int,int> >, vector<pair<long long,pair<int,int> > >, greater<pair<long long,pair<int,int> > > > H;
long long dp[DIM][33];
int v[10];
int n,m,k,i,j,x,y,cost,pos;
char buff[DIMBUFF];

int get_nr(){

    int nr = 0;
    while ('0' > buff[pos] || buff[pos] > '9')
        pos++;

    while ('0' <= buff[pos] && buff[pos] <= '9'){
        nr = nr * 10 + buff[pos] - '0';
        pos++;
    }

    return nr;

}


int main (){

    FILE *fin = stdin;
    FILE *fout = stdout;
    //FILE *fin = fopen ("date.in","r");
    //FILE *fout = fopen ("date.out","w");

    fread (buff,1,DIMBUFF,fin);
    n = get_nr(), k = get_nr(), m = get_nr();

    for (i=1;i<=k;++i)
        v[i] = get_nr();

    for (i=1;i<=m;++i){
        x = get_nr(), y = get_nr(), cost = get_nr();
        L[x].push_back(make_pair(y,cost));
        L[y].push_back(make_pair(x,cost));
    }

    for (i=1;i<=n;++i){
        for (j=0;j<=(1<<k);++j)
            dp[i][j] = INF;

        if (i != v[1] && i != v[2] && i != v[3] && i != v[4] && i != v[5])
            dp[i][0] = 0;
    }

    for (i=1;i<=k;i++){
        dp[v[i]][1<<(i-1)] = 0;
        H.push(make_pair(0,make_pair(v[i],(1<<(i-1)))));
    }

    long long sol = INF;
    while (!H.empty()){
        int nod = H.top().second.first;
        int stare = H.top().second.second;
        long long cst = H.top().first;
        if (stare == (1<<k)-1)
            sol = min (sol,cst);
        H.pop();
        if (cst != dp[nod][stare])
            continue;
        for (auto it : L[nod]){
            int vecin = it.first, cost = it.second;

            /// trb sa combin starea curenta cu toate starile care ar putea di in vecin
            int val = ((1<<k)-1) ^ stare;
            for (int new_stare=val;new_stare>=0;new_stare=(new_stare-1)&val){
                if (dp[nod][stare] + dp[vecin][new_stare] + cost < dp[vecin][stare|new_stare]){
                    dp[vecin][stare|new_stare] = dp[nod][stare] + dp[vecin][new_stare] + cost;
                    H.push(make_pair(dp[vecin][stare|new_stare],make_pair(vecin,stare|new_stare)));
                }
                if (!new_stare)
                    break;
            }}}

    fprintf(fout,"%lld",sol);

    return 0;
}

컴파일 시 표준 에러 (stderr) 메시지

cities.cpp: In function 'int main()':
cities.cpp:37:11: warning: ignoring return value of 'size_t fread(void*, size_t, size_t, FILE*)', declared with attribute warn_unused_result [-Wunused-result]
   37 |     fread (buff,1,DIMBUFF,fin);
      |     ~~~~~~^~~~~~~~~~~~~~~~~~~~
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...