Cod sursa(job #67678)

Utilizator Binary_FireFlorin Pg Binary_Fire Data 25 iunie 2007 13:15:00
Problema Obiective Scor 15
Compilator cpp Status done
Runda preONI 2007, Runda Finala, Clasele 11-12 Marime 1.12 kb
#include <cstdio>
#include <vector>
#define fin  "obiective.in"
#define fout "obiective.out"
#define Nmax 32001
#define INFI 100000000
#define Tmax 100001

using namespace std;

vector <int> g[Nmax],dir[Nmax],qu[Nmax],p[Nmax];
int N,M,T,c[Nmax],viz[Nmax],ret[Tmax];

void go() {
int i,minx,x,y,tmp;
	minx=INFI;
	for (i=1;i<=N;++i)
		if (c[i] < minx && !viz[i]) {
			x=i;
			minx=c[i];
		}
	if (minx==INFI)
		return;
	viz[x]=1;

	for (i=0;i<(int)g[x].size();++i) {
		y=g[x][i];
		if (c[x]+dir[x][i]<c[y])
			c[y]=c[x]+dir[x][i];
	}

	go();
}

int main() {
int i,j,x,y;
	freopen(fin,"r",stdin); freopen(fout,"w",stdout);

	scanf("%d%d",&N,&M);

	while ( M -- ) {
		scanf("%d%d",&x,&y);
		g[x].push_back(y); dir[x].push_back(0);
		g[y].push_back(x); dir[y].push_back(1);
	}
	
	scanf("%d",&T);

	for (i=0;i<T;++i) {
		scanf("%d%d",&x,&y);
		qu[x].push_back(y);
		p[x].push_back(i);
	}

	for (i=1;i<=N;++i) 
		if ((int)qu[i].size()>0) {
			for (j=1;j<=N;++j) {
				c[j]=INFI;
				viz[j]=0;
			}
			c[i]=0; 
			go();
			for (j=0;j<(int)qu[i].size();++j)
				ret[p[i][j]]=c[qu[i][j]];
		}

	for (i=0;i<T;++i)
		printf("%d\n",ret[i]);

	return 0;
}