比赛 |
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;
}