Cod sursa(job #633021)

Utilizator ionut_ungureanuUngureanu Vladut Ionut ionut_ungureanu Data 12 noiembrie 2011 18:33:07
Problema Sate Scor 80
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.15 kb
#include<stdio.h>
#include<vector>
#include<algorithm>
#include<queue>
#define FIN "sate.in","r",stdin
#define FOUT "sate.out","w",stdout
#define NMAX 30005

using namespace std;

int n,m,xx,yy,x,y,i,j,cost,ok,sol;
vector < vector < pair < int, int> > >a(NMAX);
queue < pair <int,int> >q;
vector<int> v(NMAX,0);
pair <int, int> cif;
vector <pair <int, int> > ::iterator it;
vector <int>lg(NMAX,0);

void read()
{
freopen(FIN);
scanf("%d %d %d %d",&n,&m,&xx,&yy);
for(i=1;i<=m;i++)
	{
		scanf("%d %d %d",&x,&y,&cost);
		a[x].push_back(make_pair(y,cost));
		a[y].push_back(make_pair(x,-cost));
	}
}

void bfs(int nod)
{
	q.push(make_pair(nod,0));
	v[nod]=1;
	ok=1;
	while(!q.empty()&&ok)
		{
			cif=q.front();
			q.pop();
			for(it=a[cif.first].begin();it!=a[cif.first].end()&&ok;++it)
				{
				if(!v[(*it).first])
					{
						v[(*it).first]=1;
						lg[(*it).first]=cif.second+(*it).second;
						q.push(make_pair((*it).first,lg[(*it).first]));
						
					}
				if((*it).first==yy)ok=0,sol=lg[yy];
				}
		}
}

void write()
{
freopen(FOUT);
printf("%d",sol);
}

int main()
{
read();
bfs(xx);
write();
return 0;
}