昨天刚说过一天写一篇博客,  眼看今天要断网了,我还没有写,于是乎就远程了一下,  加夜班也要把这篇给写好。。

首先要感谢李伟学长和小媛同学。。

这道题目困扰我两天,今天上午课都没上,写了一上午,最后仍然wa ,

中午让李伟学长看了下代码,他英语貌似不是很好,让我给他说的题目意思。。汗。。

所以按我说的题意,他是看不出来错误的。。

最后很无奈的读别人的代码,才发现题目意思理解错了。。

于是迅速写好代码在poj上交了,A了,,一上午没白逃。。

下午放学回来,再把代码交到zoj上,wa,

当时一愣,竟然会是wa,但是我把zoj上的测试实例测过来一遍也没有错,最后不得不请教小媛。。

才知道需要对一个空行进行特殊的处理。。

最后终于在23点的时候在zoj上给A了。,好不容易 ^_^

题意说起来会非常拗口,我只说一句话。

把the lowest intersection number at which a new fire station should be built so as to minimize the maximum distance from any intersection to the nearest fire station.

这一句话好好读读。。。

代码:

# include<stdio.h>
# include
<string.h>
# define PI
0xfffffff
int low[505],adj[505][505],visit[505],hash[505];
int main()
{
int i,x,n,p,q,t,min,index,index1,m,temp,Min,max,j,length;
char str[20];
while(gets(str) && strlen(str))
{
sscanf(str,
"%d%d%d",&n,&m,&length);
for(i=1;i<=m;i++)
low[i]
=PI;
for(i=1;i<=n;i++)
{
scanf(
"%d",&x);
low[x]
=0;
}
getchar();
memset(adj,
-1,sizeof(adj));
memset(visit,
0,sizeof(visit));
while(gets(str) && strlen(str))
{
sscanf(str,
"%d%d%d%d",&p,&q,&t,&length);
if(adj[p][q]==-1 || adj[p][q]>t) {adj[p][q]=t;adj[q][p]=t;}
}
index
=x;
while(n!=0)
{
visit[index]
=1;
min
=PI;
for(i=1;i<=m;i++)
{
if(visit[i]==1) continue;
if(adj[index][i]==-1 && low[i]==PI) continue;
if(adj[index][i]!=-1)
{
if(low[i]==PI || low[i]>low[index]+adj[index][i]) low[i]=low[index]+adj[index][i];
}
if(low[i]<min) {min=low[i];index1=i;}
}
if(min==PI) break;
index
=index1;
}
index
=1;
min
=PI;
for(i=1;i<=m;i++)
{
if(low[i]==0) continue;
for(j=1;j<=m;j++)
{
visit[j]
=0;
hash[j]
=low[j];
}
temp
=i;
hash[i]
=0;
while(1)
{
Min
=PI;
visit[temp]
=1;
for(j=1;j<=m;j++)
{
if(visit[j]==1 || low[j]==0) continue;
if(adj[temp][j]!=-1)
{
if(adj[temp][j]+hash[temp]<hash[j]) hash[j]=adj[temp][j]+hash[temp];
}
if(hash[j]<low[j] && hash[j] <Min) {Min=hash[j];index1=j;}
}
if(Min==PI) break;
temp
=index1;
}
max
=-1;
for(j=1;j<=m;j++)
if(hash[j]>max) max=hash[j];
if(max<min) {min=max;index=i;}
}
printf(
"%d\n",index);
}
return 0;
}
posted on 2011-03-23 23:27  奋斗青春  阅读(305)  评论(0编辑  收藏  举报