Cod sursa(job #342125)

Utilizator bog29Antohi Bogdan bog29 Data 20 august 2009 17:39:16
Problema Sate Scor 80
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.44 kb
#include<fstream>
#include<stdlib.h>
#define dmax 30003
using namespace std;
ifstream in("sate.in");
ofstream out("sate.out");
int n,m,a,b;
bool viz[dmax];
int* g[dmax];
long long* dist[dmax];
struct queue
{	int nod;
	long long d;
}	c[dmax];
void bfs()
{	int p1=0,p2=0,i,cr;
	c[p1].nod=a;
	c[p1].d=0;
	viz[a]=1;
	while(p1<=p2)
	{	cr=c[p1].nod;
		for(i=1;i<=g[cr][0];i++)
			if(!viz[g[cr][i]])
			{	p2++;
				c[p2].nod=g[cr][i];
				viz[g[cr][i]]=1;
				if(g[cr][i]<cr)
				{	c[p2].d=c[p1].d-dist[cr][i];
				}
				else if(g[cr][i]>cr)
				{	c[p2].d=c[p1].d+dist[cr][i];
				}
				if(g[cr][i]==b)
				{	out<<c[p2].d;
					break;
					//p1=p2+1;
				}	
			}
		p1++;
	}		
}
int main()
{	int i,x,y,t;
	long long z;
	in>>n>>m>>a>>b;
	if(a>b)
	{	t=b;
		b=a;
		a=t;
	}	
	for(i=1;i<=n;i++)
	{	g[i]=(int*)realloc(g[i],sizeof(int));
		g[i][0]=0;
		dist[i]=(long long*)realloc(dist[i],sizeof(long long));
		dist[i][0]=0;
	}	
	for(i=1;i<=m;i++)
	{	in>>x>>y>>z;	
		g[x][0]++;
		g[x]=(int*)realloc(g[x],(g[x][0]+1)*sizeof(int));
		g[x][g[x][0]]=y;
		g[y][0]++;
		g[y]=(int*)realloc(g[y],(g[y][0]+1)*sizeof(int));
		g[y][g[y][0]]=x;
		dist[x][0]++;
		dist[x]=(long long*)realloc(dist[x],(dist[x][0]+1)*sizeof(long long));
		dist[x][dist[x][0]]=z;
		dist[y][0]++;
		dist[y]=(long long*)realloc(dist[y],(dist[y][0]+1)*sizeof(long long));
		dist[y][dist[y][0]]=z;
	}
	in.close();
	bfs();
	out.close();
	return 0;
}