比赛 2008haoi模拟训练1 评测结果 AAATTTTTTT
题目名称 水管局长 最终得分 30
用户昵称 zqzas 运行时间 21.249 s
代码语言 C++ 内存使用 15.57 MiB
提交时间 2008-04-22 11:08:26
显示代码纯文本
#include <stdio.h>

#define max(x,y) (x)>(y)?(x):(y)
#define min(x,y) (x)<(y)?(x):(y)
#define maxn 1210
#define inf 31000

int n,m,q,dis[maxn],data[maxn][maxn],map[maxn][maxn];
FILE *f1,*f2;

void dij(int source)
{
	int i,j,x,min,hash[maxn]={0};
	//dis 表示当前到某点的最小"距离"
	for (i=0;i<=n;i++)
		dis[i]=inf;
	dis[source]=0;
	//hash[source]=1;
	for (i=1;i<=n;i++)
	{
		min=1011;
		dis[min]=inf;
		for (j=1;j<=n;j++)
		{
			if (dis[j]<dis[min] && hash[j]==0)
				min=j;
		}
		hash[min]=1;
		for (j=1;j<=map[min][0];j++)
		{
			x=map[min][j];
			if (data[min][x]==-1)
				continue;
			dis[x]=min(dis[x],max(data[min][x],dis[min]));
		}
	}
}

void run(void)
{
	int i,a,b,k;
	for (i=1;i<=q;i++)
	{
		fscanf(f1,"%d%d%d",&k,&a,&b);
		if (k==2)
		{
			data[a][b]=-1;
			data[b][a]=-1;
		}
		if (k==1)
		{
			dij(a);
			fprintf(f2,"%d\n",dis[b]);
		}
	}
}

void ini(void)
{
	int i,j,a,b,c;
	for(i=0;i<maxn;i++)
		for (j=0;j<maxn;j++)
			data[i][j]=-1;
	fscanf(f1,"%d%d%d",&n,&m,&q);
	for (i=1;i<=m;i++)
	{
		fscanf(f1,"%d%d%d",&a,&b,&c);
		data[a][b]=c;
		data[b][a]=c;
		map[a][++map[a][0]]=b;
		map[b][++map[b][0]]=a;
	}
}

int main(void)
{
	f1=fopen("tube.in","r");
	f2=fopen("tube.out","w");
	ini();
	run();
	fclose(f1);fclose(f2);
	return 0;
}