Cod sursa(job #1418775)

Utilizator mariusadamMarius Adam mariusadam Data 13 aprilie 2015 23:21:00
Problema Ubuntzei Scor 25
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.35 kb
#include <iostream>
#include <fstream>
#include <queue>
#include <cstring>
#define inf 0x3f3f3f3f
#define nmax 2001

using namespace std;

struct Nod {
    int nd;
    int cost;
    Nod *next;
};

Nod *G[nmax];

void addEdge(Nod *&ni,int nj,int cij) {

    Nod *p=new Nod;
    p->next=ni;
    p->nd=nj;
    p->cost=cij;
    ni=p;
}
void getData(Nod *G[nmax],int &n,int &m,int (&fr)[15],int &k) {
    int i,j,c,z;

    ifstream r("ubuntzei.in");
    r>>n>>m;

    r>>k;
    for (z=1;z<=k;z++)
        r>>fr[z];

    for (z=1;z<=m;z++) {
        r>>i>>j>>c;
            addEdge(G[i],j,c);
            addEdge(G[j],i,c);
    }
    r.close();
}

void doBellmanFord(Nod *G[nmax],int (&dmin)[nmax],int n,int source) {
    queue <int> Q;
    bool viz[nmax];

    memset(viz,false,sizeof(viz));
    memset(dmin,inf,sizeof(dmin));

    Q.push(source);
    dmin[source]=0;
    viz[source]=true;
    while (!Q.empty()) {
        int prec=Q.front();
        Q.pop();
        Nod *p=new Nod;
        viz[prec]=false;
        p=G[prec];
        while (p) {
            if (dmin[prec]+p->cost<dmin[p->nd]) {
                dmin[p->nd]=dmin[prec]+p->cost;
                if (!viz[p->nd]) {
                    viz[p->nd]=true;
                    Q.push(p->nd);
                }
            }
            p=p->next;
        }
    }
}

void printCost(int x) {

    ofstream w("ubuntzei.out");
    w<<x<<endl;
    w.close();
}

void solve(Nod *G[nmax],int n,int (&fr)[15],int k) {
    int dmin[nmax],costfinal=0;

    doBellmanFord(G,dmin,n,1);
    if (k==0)
        costfinal=dmin[n];
    else {
        bool used[15],ok=false;

        memset(used,false,sizeof(used));

        while (!ok) {
            int fmin=inf,newsource,pfr;
            ok=true;
            for (int i=1;i<=k;i++)
                if (!used[i] && fmin>dmin[fr[i]]) {
                    fmin=dmin[fr[i]];
                    newsource=fr[i];
                    ok=false;
                    pfr=i;
                }
            used[pfr]=true;
            if (!ok) {
                costfinal+=fmin;
                doBellmanFord(G,dmin,n,newsource);
            }
        }
        costfinal+=dmin[n];
    }
    printCost(costfinal);
}

int main() {
    int fr[15],n,m,k;

    getData(G,n,m,fr,k);
    solve(G,n,fr,k);
}