Cod sursa(job #245040)

Utilizator andrei-alphaAndrei-Bogdan Antonescu andrei-alpha Data 16 ianuarie 2009 16:35:51
Problema Sate Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.95 kb
using namespace std;

#include <set>
#include <map>
#include <list>
#include <deque>
#include <stack>
#include <queue>
#include <cmath>
#include <cstdio>
#include <vector>
#include <string>
#include <bitset>
#include <utility>
#include <algorithm>

#define pb push_back
#define sz size
#define f first
#define s second
#define II inline
#define ll long long
#define db double
#define FOR(i,a,b) for(int i=a;i<=b;++i)
#define all(v) v.begin() , v.end()
#define CC(v) memset((v),0,sizeof((v)))
#define CP(v,w) memcpy((v),(w),sizeof((w)))
#define mp make_pair


typedef vector<int> VI;
typedef pair<int,int> pi;
typedef vector<string> VS;

#define  IN "sate.in"
#define OUT "sate.out"
#define N_MAX 1<<15

typedef pair<int,int> pi;
int K,N,M,X,Y;
vector< vector<pi> > A(N_MAX);
char buffer[1<<21];
int D[N_MAX];

II void read(int &aux)
{
	aux = 0;
	for(;buffer[K] < '0' || buffer[K] > '9';++K);
	for(;buffer[K] >= '0' && buffer[K] <= '9';++K)
		aux = aux * 10 + buffer[K] - '0';
}

II void scan()
{
	freopen(IN,"r",stdin);
	freopen(OUT,"w",stdout);
	fread(buffer,1,1<<21,stdin);
	fclose(stdin);
	
	read(N);
	read(M);
	read(X);
	read(Y);
	
	int x,y,c;
	FOR(i,1,M)
	{
		read(x),read(y),read(c);
		A[x].pb( mp(y,c) );
		A[y].pb( mp(x,-c) );
	}
}	

struct Comp
{
	bool operator () (int i,int j)
	{
		return D[i] > D[j];
	}
};
priority_queue<int,vector<int>,Comp/*greater<int>*/ > Q;

II void solve()
{
	Q.push(X);
	int B[N_MAX];
	
	memset(D,90,sizeof(D));
	CC(B);
	
	D[X] = 0;
	Q.push(X);
	++B[X];
	
	for(int nod;!Q.empty();)
	{
		nod = Q.top();
		Q.pop();
		--B[nod];
		
		if(B[nod])
			continue;
		
		int l = A[nod].sz()-1;
		FOR(i,0,l)
		{
			int fiu = A[nod][i].f;
			int dist = A[nod][i].s;
			if(D[fiu] > D[nod] + dist)
			{
				D[fiu] = D[nod] + dist;
				Q.push(fiu);
				++B[fiu];
			}
		}	
	}
	printf("%d\n",D[Y]);
}

int main()
{
	scan();
	solve();
	return 0;
}