Cod sursa(job #67827)

Utilizator blasterzMircea Dima blasterz Data 25 iunie 2007 17:39:19
Problema Obiective Scor 35
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.84 kb
using namespace std;
#include <cstdio>
#include <vector>
#include <queue>
#include <string>
#define maxn 1<<15
#define oo 0x3f3f3f3f

struct nod { int n; int cost; nod(){}; nod(int a,int c){n=a;cost=c;};};//__attribute__((packed));

vector<vector<nod> >a;
vector<vector<int> >query;
vector<vector<int> > poz;
vector<vector<int> > sol;
int solutie[100001];
int n, m, T;
bool operator <(const nod &a, const nod &b)
{
	if(a.cost>b.cost) return 1;
	return 0;
}


void citire()
{
	
	freopen("obiective.in", "r", stdin);
	scanf("%d %d\n", &n, &m);
	a.resize(n+1);
	query.resize(n+1);
	poz.resize(n+1);
	sol.resize(n+1);
	int p, q;
	while(m--)
	{
		scanf("%d %d\n", &p, &q);
		a[p].push_back(nod(q, 0));
		a[q].push_back(nod(p, 1));
	}

	scanf("%d\n", &T);
	for(int i=1;i<=T;++i)
	{
		scanf("%d %d\n",&p, &q);
		query[p].push_back(q);
		poz[p].push_back(i);
	}
}

void dijkstra(int source)
{
	priority_queue<nod> Q;
	bool viz[maxn];
	int d[maxn];
	int nh=n, u;
	Q.push(nod(source, 0));
	memset(d, oo, sizeof(d));
	memset(viz, 0, sizeof(viz));
	d[source]=0;
	vector<nod>::iterator it;
	while(!Q.empty() && nh)
	{
		u=Q.top().n;
		Q.pop();
		if(viz[u]) continue;
		viz[u]=1;
		nh--;
		
		for(it=a[u].begin();it!=a[u].end();++it)
			if(d[it->n]>d[u]+it->cost)
			{
				d[it->n]=d[u]+it->cost;
				Q.push(nod(it->n, d[it->n]));
			}
	}
	
	vector<int>::iterator it2;
	for(it2=query[source].begin();it2!=query[source].end();++it2)
		sol[source].push_back(d[*it2]);
}


void solve()
{
	int i;
	for(i=1;i<=n;++i)
		if(!query[i].empty()) dijkstra(i);
	int j;
	for(i=1;i<=n;++i)
		for(j=0;j<query[i].size();++j)
			solutie[poz[i][j]]=sol[i][j];
	
	for(i=1;i<=T;++i) printf("%d\n", solutie[i]);
	
}
	

	
int main()
{
	freopen("obiective.out", "w", stdout);
	citire();
	solve();
	
	return 0;
}