Cod sursa(job #1146660)

Utilizator DanutsDanut Rusu Danuts Data 19 martie 2014 10:35:28
Problema Distante Scor 40
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.52 kb
#include <iostream>
#include<fstream>
#include<vector>
#include<set>
#define maxn 100010
#define INF 99999999
using namespace std;
ifstream f("distante.in");
ofstream g("distante.out");
vector<int> G[maxn],C[maxn];
set <pair <int,int> > T;
int d[maxn],li[maxn];
int n,m,s,x,y,c,val,nod,graf,ok2=1;
int dij(){
    ok2=1;
    for(int i=1;i<=n;i++)
        d[i]=INF;
    T.insert(make_pair(0,s));
    while(T.size()>0 && ok2){
        val=(*T.begin()).first;
        nod=(*T.begin()).second;
        T.erase(*T.begin());
        for(int i=0;i<G[nod].size();i++)
            if(d[G[nod][i]]>val+C[nod][i]){
                d[G[nod][i]]=val+C[nod][i];
                T.insert(make_pair(d[G[nod][i]],G[nod][i]));
            if(d[G[nod][i]]<li[G[nod][i]])
                ok2=0;
            }
    }
}
int main()
{
    f>>graf;
    for(int i=1;i<=graf;i++){
        f>>n>>m>>s;
        for(int j=1;j<=n;j++)
            f>>li[j];
        for(int j=1;j<=m;j++){
            f>>x>>y>>c;
            G[x].push_back(y);
            G[y].push_back(x);
            C[x].push_back(c);
            C[y].push_back(c);
        }
        dij();
        if(ok2==1){
        int ok=1;
        d[s]=0;
        for(int j=1;j<=n;j++)
            if(li[j]!=d[j])
                ok=0;
        if(ok==0)
        g<<"NU"<<'\n';
        else
        g<<"DA"<<'\n';
        }
        else
        g<<"NU"<<'\n';

        for(int i=1;i<=n;i++){
        G[i].clear();
        C[i].clear();
        }
    }
    return 0;
}