Cod sursa(job #2797003)

Utilizator AndreidreiGresoiu Liviu-Andrei Andreidrei Data 9 noiembrie 2021 09:44:19
Problema Distante Scor 100
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 2.06 kb
#include <bits/stdc++.h>
#define din cin
#define dout out
#define pi 3.14159265359
#define sw(x,y) x^=y,y^=x,x^=y
#define bmin(a,b)((a<b)?(a):(b))
#define bmax(a,b)((a>b)?(a):(b))
#define ll long long
#define forq(i,ii,n)for(i=ii;i<n;i++)
using namespace std;
//ifstream in("distante.in");
ofstream out("distante.out");
ll n,m,i,j,k,d[50001],c[50001],t,s,z[50001];vector<pair<ll,ll>>a[50001];map<ll,bool>b;
class InParser {
private:
	FILE *fin;
	char *buff;
	int sp;

	char read_ch() {
		++sp;
		if (sp == 4096) {
			sp = 0;
			fread(buff, 1, 4096, fin);
		}
		return buff[sp];
	}

public:
	InParser(const char* nume) {
		fin = fopen(nume, "r");
		buff = new char[4096]();
		sp = 4095;
	}

	InParser& operator >> (int &n) {
		char c;
		while (!isdigit(c = read_ch()) && c != '-');
		int sgn = 1;
		if (c == '-') {
			n = 0;
			sgn = -1;
		} else {
			n = c - '0';
		}
		while (isdigit(c = read_ch())) {
			n = 10 * n + c - '0';
		}
		n *= sgn;
		return *this;
	}

	InParser& operator >> (long long &n) {
		char c;
		n = 0;
		while (!isdigit(c = read_ch()) && c != '-');
		long long sgn = 1;
		if (c == '-') {
			n = 0;
			sgn = -1;
		} else {
			n = c - '0';
		}
		while (isdigit(c = read_ch())) {
			n = 10 * n + c - '0';
		}
		n *= sgn;
		return *this;
	}
};
InParser in("distante.in");
int main()
{
in>>t;
while(t--)
{
fill(d,d+50001,0);fill(c,c+50001,LLONG_MAX);b.clear();
in>>n>>m>>s;
//cout<<"HERE";
for(i=1;i<=n;i++)in>>z[i],a[i].clear();
while(m--)
    in>>i>>j>>k,a[i].push_back(make_pair(j,k)),a[j].push_back(make_pair(i,k));
b[s]=s,c[s]=s;
while(b.empty()==0)
{
    k=b.begin()->first;
    b.erase(b.begin());
    //cout<<(k&USHRT_MAX)<<' '<<(k>>16)<<'\n';
    d[k&65535]=k>>16;
    k&=65535;
    for(auto i=a[k].begin();i!=a[k].end();++i)
        {
            j=(((long long)(i->second+d[k]))<<16)+i->first;
            if(j<c[i->first])
                b.erase(c[i->first]),c[i->first]=j,b[c[i->first]]=1;
        }
}
//cout<<n<<'\n';
if(equal(d+1,d+n+1,z+1))out<<"DA\n";
    else out<<"NU\n";
}
}