比赛 2008haoi模拟训练1 评测结果 C
题目名称 水管局长 最终得分 0
用户昵称 BYVoid 运行时间 0.000 s
代码语言 C++ 内存使用 0.00 MiB
提交时间 2008-04-22 09:40:33
显示代码纯文本
#include <iostream>
#include <fstream>
#define MAXN 2000

using namespace std;

class queue
{
private:
	long list[MAXN];
	long first,last;
public:
	long size;
	queue()
	{
		reset();
	}

	void reset()
	{
		size=0;
		first=0;
		last=-1;
	}

	void ins(long k)
	{
		size++;
		list[++last]=k;
	}

	long del()
	{
		size--;
		return list[first++];
	}
};

ifstream fi("tube.in");
ofstream fo("tube.out");

long N,M,Q,ITF;
long dis[MAXN][MAXN];
long adjl[MAXN][MAXN];
queue Queue;

void init()
{
	long i;
	fi >> N >> M >> Q;
	memset(dis,0xf,sizeof(dis));
	ITF=dis[0][0];
	for (i=1;i<=N;i++)
		dis[i][i]=0;
	for (i=1;i<=M;i++)
	{
		long a,b,v;
		fi >> a >> b >> v;
		dis[a][b]=dis[b][a]=v;
		adjl[a][ ++adjl[a][0] ]=b;
		adjl[b][ ++adjl[b][0] ]=a;
	}
}

inline long max(long a,long b)
{
	return a>b?a:b;
}

inline long min(long a,long b)
{
	return a<b?a:b;
}

void floodfill(long start,long *sp)
{
	long x,i,j,T;
	Queue.reset();
	Queue.ins(start);
	sp[start]=0;
	while (Queue.size)
	{
		x=Queue.del();
		for (i=1;i<=adjl[x][0];i++)
		{
			j=adjl[x][i];
			if (dis[x][j]!=ITF)
			{
				if (sp[j]==ITF)
					Queue.ins(j);
				T=max(sp[x],dis[x][j]);
				sp[j]=min(sp[j],T);
			}
		}
	}
}

void request()
{
	long q,k,x,y;
	long sp[MAXN];
	for (q=1;q<=Q;q++)
	{
		fi >> k >> x >> y;
		if (k==2)
			dis[x][y]=dis[y][x]=ITF;
		else
		{
			memset(sp,0xf,sizeof(sp));
			floodfill(x,sp);
			fo << sp[y] <<endl;
		}
	}
}

void print()
{
	fi.close();
	fo.close();
}

int main()
{
	init();
	request();
	print();
	return 0;
}