제출 #69877

#제출 시각아이디문제언어결과실행 시간메모리
69877Bodo171Cities (BOI16_cities)C++14
100 / 100
3990 ms53528 KiB
#include <iostream>
#include <fstream>
#include <queue>
#include <vector>
#include <climits>
using namespace std;
const int nmax=100005;
vector< pair<int,long long> > v[nmax];
long long d[nmax][32];
bool E[nmax][32];
int norm[nmax],imp[10];
long long di,newd,ans;
int x,n,m,nod,k,i,j,y,z,stare,stare_noua,orig;
struct node
{
    long long D;
    int node,state;
};
struct cmp
{
    bool operator()(node unu,node doi)
    {
        return unu.D>doi.D;
    }
};
priority_queue <node,vector<node>,cmp > pq;
void dij()
{
    for(stare=1;stare<(1<<k);stare++)
    {
       for(x=1;x<=n;x++)
        {
            for(i=stare; i!=0; i=((i-1)&stare))
            {
                newd=1LL*d[x][i]+d[x][(stare-i)];
                if(newd<d[x][stare])
                {
                    d[x][stare]=newd;
                }
            }
            if(d[x][stare]<1LL*1e17)
               pq.push({d[x][stare],x,stare});
        }
        while(!pq.empty())
        {
            x=pq.top().node;
            di=pq.top().D;
            pq.pop();
            if(stare==(1<<k)-1)
            {
                ans=di;
                return;
            }
            if(!E[x][stare])
            {
                E[x][stare]=1;
                for(i=0; i<v[x].size(); i++)
                {
                    nod=v[x][i].first;
                    newd=v[x][i].second+di;
                    if(newd<d[nod][stare])
                    {
                        d[nod][stare]=newd;
                        pq.push({newd,nod,stare});
                    }
                }

            }
        }
    }
}
int main()
{
    //freopen("data.in","r",stdin);
    ios_base::sync_with_stdio(false);
    cin>>n>>k>>m;
    for(i=1;i<=k;i++)
    {
        cin>>imp[i];
        norm[imp[i]]=i;
    }
    for(i=1;i<=m;i++)
    {
        cin>>x>>y>>z;
        v[x].push_back({y,z});
        v[y].push_back({x,z});
    }
    for(i=1;i<=n;i++)
      for(j=1;j<(1<<k);j++)
         d[i][j]=1LL*1e17;
    for(i=1;i<=k;i++)
    {
        d[imp[i]][(1<<(i-1))]=0;
    }
    ans=LLONG_MAX;
    dij();
    cout<<ans;
    return 0;
}

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

cities.cpp: In function 'void dij()':
cities.cpp:57:27: warning: comparison between signed and unsigned integer expressions [-Wsign-compare]
                 for(i=0; i<v[x].size(); i++)
                          ~^~~~~~~~~~~~
#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...