昨天刚说过一天写一篇博客, 眼看今天要断网了,我还没有写,于是乎就远程了一下, 加夜班也要把这篇给写好。。
首先要感谢李伟学长和小媛同学。。
这道题目困扰我两天,今天上午课都没上,写了一上午,最后仍然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;
}