Cod sursa(job #2073201)

Utilizator DawlauAndrei Blahovici Dawlau Data 22 noiembrie 2017 19:55:44
Problema Ubuntzei Scor 20
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.04 kb
#include<fstream>
#include<list>
#include<queue>
#include<bitset>
#include<climits>
using namespace std;
ifstream fin("ubuntzei.in");
ofstream fout("ubuntzei.out");
const int NMAX=2005,INF=INT_MAX;
struct graph{
    int next_node,cost;
};
struct priot_queue{
    int nr_cities,current_node;
};
int dist[NMAX][NMAX],n,m,k;
class cmp{
    bool ok;
    public:
        bool operator ()(const priot_queue &a,const priot_queue &b){
            if(ok)
                return dist[a.current_node][a.nr_cities]<dist[b.current_node][b.nr_cities];
            return dist[a.current_node][a.nr_cities]>dist[b.current_node][b.nr_cities];
        }
};
list<graph>g[NMAX];
bitset<NMAX>isCity,in_queue[NMAX];
priority_queue<priot_queue,vector<priot_queue>,cmp>pq;
void read_data(){
    int from,to,city,c,i;
    fin>>n>>m>>k;
    for(i=1;i<=k;++i){
        fin>>city;
        isCity[city]=true;
    }
    while(m--){
        fin>>from>>to>>c;
        g[from].push_back({to,c});
        g[to].push_back({from,c});
    }
}
void dijkstra(){
    list<graph>::iterator it;
    int i,nextnode_cost,nextnode;
    priot_queue node;
    for(i=1;i<=n;++i)
        fill(dist[i],dist[i]+1+k,INF);
    dist[1][0]=0;
    pq.push({0,1});
    in_queue[1][0]=true;
    while(!pq.empty()){
        node=pq.top();
        pq.pop();
        in_queue[node.current_node][node.nr_cities]=false;
        for(it=g[node.current_node].begin();it!=g[node.current_node].end();++it){
            nextnode=it->next_node;
            nextnode_cost=it->cost;
            if(dist[nextnode][node.nr_cities+isCity[nextnode]]>dist[node.current_node][node.nr_cities]+nextnode_cost){
                dist[nextnode][node.nr_cities+isCity[nextnode]]=dist[node.current_node][node.nr_cities]+nextnode_cost;
                if(!in_queue[nextnode][node.nr_cities+isCity[nextnode]]){
                    pq.push({node.nr_cities+isCity[nextnode],nextnode});
                }
            }
        }
    }
}
int main(){
    read_data();
    dijkstra();
    fout<<dist[n][k];
}