Submission #69877

# Submission time Handle Problem Language Result Execution time Memory
69877 2018-08-21T18:42:41 Z Bodo171 Cities (BOI16_cities) C++14
100 / 100
3990 ms 53528 KB
#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;
}

Compilation message

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 time Memory Grader output
1 Correct 4 ms 2680 KB Output is correct
2 Correct 4 ms 2920 KB Output is correct
3 Correct 4 ms 2920 KB Output is correct
4 Correct 5 ms 2920 KB Output is correct
5 Correct 5 ms 2920 KB Output is correct
# Verdict Execution time Memory Grader output
1 Correct 830 ms 45612 KB Output is correct
2 Correct 776 ms 45612 KB Output is correct
3 Correct 506 ms 45612 KB Output is correct
4 Correct 114 ms 45612 KB Output is correct
5 Correct 376 ms 45612 KB Output is correct
6 Correct 98 ms 45612 KB Output is correct
7 Correct 6 ms 45612 KB Output is correct
8 Correct 6 ms 45612 KB Output is correct
# Verdict Execution time Memory Grader output
1 Correct 12 ms 45612 KB Output is correct
2 Correct 9 ms 45612 KB Output is correct
3 Correct 8 ms 45612 KB Output is correct
4 Correct 8 ms 45612 KB Output is correct
# Verdict Execution time Memory Grader output
1 Correct 1861 ms 45828 KB Output is correct
2 Correct 1854 ms 45828 KB Output is correct
3 Correct 1235 ms 45828 KB Output is correct
4 Correct 1263 ms 45828 KB Output is correct
5 Correct 382 ms 45828 KB Output is correct
6 Correct 150 ms 45828 KB Output is correct
# Verdict Execution time Memory Grader output
1 Correct 3962 ms 45828 KB Output is correct
2 Correct 3990 ms 50052 KB Output is correct
3 Correct 3739 ms 53528 KB Output is correct
4 Correct 2765 ms 53528 KB Output is correct
5 Correct 2072 ms 53528 KB Output is correct
6 Correct 524 ms 53528 KB Output is correct
7 Correct 215 ms 53528 KB Output is correct