Cod sursa(job #628826)

Utilizator akumariaPatrascanu Andra-Maria akumaria Data 2 noiembrie 2011 10:51:45
Problema Sate Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.07 kb
#include<stdio.h>
#include<vector>
#include<queue>


using namespace std;

struct edge
{int x, d;};


vector<edge> eg[30010];
int d[30010];
queue<edge> q;


int main()
{
	freopen("sate.in","r",stdin);
	freopen("sate.out","w",stdout);
	int n,i,j,k,m,x,y;
	edge cv,altcv;
	scanf("%d%d%d%d",&n,&m,&x,&y);
	for(i=1;i<=m;++i)
	{
		scanf("%d%d%d",&cv.x,&k,&cv.d);
		eg[k].push_back(cv);
		j=cv.x;
		cv.x=k;
		eg[j].push_back(cv);
	}
	k=eg[x].size();
	d[x]=-1;
	for(i=0;i<k;++i)
	{
		if(eg[x][i].x>x)
		{
		d[eg[x][i].x]=eg[x][i].d;
		q.push(eg[x][i]);
		}
		else
		{
			cv.x=eg[x][i].x;
			cv.d=0-eg[x][i].d;
			q.push(cv);
			d[eg[x][i].x]=0-eg[x][i].d;
		}
	}
	while(!q.empty())
	{
		cv=q.front();
		j=eg[cv.x].size();
		for(i=0;i<j;++i)
		{
			altcv.x=eg[cv.x][i].x;
			if(cv.x<altcv.x)
			altcv.d=cv.d+eg[cv.x][i].d;
			else
				altcv.d=cv.d-eg[cv.x][i].d;
			if(altcv.d<d[altcv.x]||d[altcv.x]==0)
			{
				if(altcv.x!=y)
				q.push(altcv);
				d[altcv.x]=altcv.d;
			}
		}
		q.pop();
	}
	printf("%d\n",d[y]);
	return 0;
}