Cod sursa(job #1045149)

Utilizator mircea.dobreanuMircea Dobreanu mircea.dobreanu Data 30 noiembrie 2013 22:38:20
Problema Distante Scor 10
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.43 kb
#include<fstream>
#include<vector>
using namespace std;
 
const int MAXN=50005;
struct edge{int dest,cost;};
vector<edge> adj[MAXN];
ifstream fin("distante.in");
ofstream fout("distante.out");
int t,n,m,s;
int d[MAXN];
bool uz[MAXN];
 
void solve()
{
    bool flag=true;
    int u,v;
    for (u=1; u<=n && flag; ++u)
    {
        for (vector<edge>::iterator v=adj[u].begin(); v!=adj[u].end(); ++v)
        {
            if (d[u]+v->cost<d[v->dest] || d[v->dest]+v->cost<d[u])
            {
                flag=false;
                break;
            }
            if (d[u]+v->cost==d[v->dest])
                uz[v->dest]=true;
            if (d[v->dest]+v->cost==d[u])
                uz[u]=true;
        }
    }
    for (u=1; u<=n; ++u)
        if (!uz[u])
            flag=false;
    if (flag)
        fout<<"DA\n";
    else
        fout<<"NU\n";
}
void cleanup()
{
    for (int i=1; i<=n; ++i)
    {
        while (!adj[i].empty())
        {
            adj[i].pop_back();
        }
    }
}
int main()
{
    edge aux;
    int a,b,c;
    fin>>t;
    for (int k=1; k<=t; ++k)
    {
        fin>>n>>m>>s;
        for (int i=1; i<=n; ++i)
            fin>>d[i];
        for (int i=1; i<=m; ++i)
        {
            fin>>a>>b>>c;
            aux.dest=b; aux.cost=c;
            adj[a].push_back(aux);
            aux.dest=a;
            adj[b].push_back(aux);
        }
        solve();
        cleanup();
    }
    fin.close();
    fout.close();
    return 0;
}