Cod sursa(job #692998)

Utilizator auRSTARHreapca Aurelian auRSTAR Data 26 februarie 2012 22:44:15
Problema Sate Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.05 kb
#include<cstdio>
#include<vector>
#include<bitset>
#include<deque>
#include<algorithm>
#include<cstring>
using namespace std;
bitset<30010> in_q;
vector<pair<int,int> >V[30010];
deque<int> Q;
void read(),solve();
int n,m,A,B,a,b,c,cost[30010];
int main()
{
	read();
	solve();
	return 0;
}
void read()
{
	freopen("sate.in","r",stdin);
	freopen("sate.out","w",stdout);
	scanf("%d%d%d%d",&n,&m,&A,&B);
	if(A>B)swap(A,B);
	for(;m;--m)
	{
		scanf("%d%d%d",&a,&b,&c);
		if(a>b)swap(a,b);
		V[a].push_back(make_pair(b,c));
		V[b].push_back(make_pair(a,-c));
	}
	memset(cost,355,sizeof(cost));
}
void solve()
{
	in_q[A]=1;
	Q.push_back(A);
	cost[A]=0;
	for(;!Q.empty();)
	{
		a=Q.front();
		for(vector<pair<int,int> >::iterator it=V[a].begin();it!=V[a].end();it++)
		{
			b=it->first;
			c=it->second;
			if(cost[b]>cost[a]+c)
			{
				cost[b]=cost[a]+c;
				if(b==B)break;
				if(!in_q[b])
				{
					Q.push_back(b);
					in_q[b]=1;
				}
			}
		}
		if(b==B)break;
		in_q[a]=0;
		Q.pop_front();
	}
	printf("%d\n",cost[B]);
}