Cod sursa(job #80294)

Utilizator blasterzMircea Dima blasterz Data 27 august 2007 10:32:35
Problema PScNv Scor 80
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.3 kb
using namespace std;
#include <cstdio>
#include <vector>
#include <string>
#define pb push_back
#define maxn 250001

struct nod{ int n, c;nod(){}; nod(int a, int b){n=a; c=b;};};
int n, source, sink;
vector<nod>a[maxn];
char ax[10000000];
void read()
{
	int m;
	freopen("pscnv.in","r",stdin);
	scanf("%d %d %d %d\n",&n, &m, &source,&sink);
	fread(ax, sizeof(char), m*19, stdin);
	char *t;
	int  p, q, c;
	t=strtok(ax, " ");
	p=atoi(t);
	t=strtok(0, " ");
	q=atoi(t);
	t=strtok(0, " \n");
	c=atoi(t);
	if(p!=q) a[p].pb(nod(q, c));
	--m;
	while(m--)
	{
		t=strtok(0, " ");
		p=atoi(t);
		t=strtok(0, " ");
		q=atoi(t);
		t=strtok(0, " \n");
		c=atoi(t);
	if(p!=q) a[p].pb(nod(q, c));
		
	}
}

int bfs(int K)
{
	int Q[maxn], p=1, q=1, u;
	bool viz[maxn];
	memset(viz, 0, sizeof(viz));
	vector<nod>::iterator it;
	Q[1]=source;
	viz[source]=1;
	while(p<=q)
	{
		u=Q[p++];
		for(it=a[u].begin();it!=a[u].end();++it)
			if(!viz[it->n] && it->c<=K)
			{
				Q[++q]=it->n;
				viz[it->n]=1;
				if(it->n==sink) {return 1;}
			}
	}
	return 0;
	
}

void solve()
{
	
	int i, cnt;
	
	for(i=1000, cnt=(1<<10); cnt ; cnt>>=1)
		if(i-cnt>=0)
			if(bfs(i-cnt)) i-=cnt;
	printf("%d\n", i);
}

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