题目思路:求一个最短路,再类比着求一个“最长路”,加起来除以二。。。
AC代码:
#include<stdio.h>
#define inf 0xfffffff
int maps[105][105],mapb[105][105],n;
int prim()
{
int cur=0,next,i,j,m=n+1;
int vis[105]={0},dis[105];
for(i=0;i<=n;i++)
dis[i]=inf;
dis[0]=0;
while(m--)
{
vis[cur]=1;
int min=inf;
for(i=0;i<=n;i++)
{
if(vis[i])continue;
if(maps[cur][i]<dis[i])
dis[i]=maps[cur][i];
if(dis[i]<min)
{
next=i;min=dis[i];
}
}
cur=next;
}
int ans=0;
for(i=0;i<=n;i++)
ans+=dis[i];
return ans;
}
int pppp()
{
int cur=0,next,i,j,m=n+1;
int vis[105]={0},dis[105]={0};
while(m--)
{
vis[cur]=1;
int max=-1;
for(i=0;i<=n;i++)
{
if(vis[i])continue;
if(mapb[cur][i]>dis[i])
dis[i]=mapb[cur][i];
if(dis[i]>max)
{
next=i;max=dis[i];
}
}
cur=next;
}
int ans=0;
for(i=0;i<=n;i++)
ans+=dis[i];
return ans;
}
int main()
{
int t,aaaa=1;
scanf("%d",&t);
while(t--)
{
int a,b,c,i,j;
scanf("%d",&n);
for(i=0;i<=n;i++)
for(j=0;j<=n;j++)
{
maps[i][j]=(i==j?0:inf);
mapb[i][j]=0;
}
while(~scanf("%d%d%d",&a,&b,&c),a+b+c)
{
if(maps[a][b]>c)maps[a][b]=maps[b][a]=c;
if(mapb[a][b]<c)mapb[a][b]=mapb[b][a]=c;
}
int mina,maxn;
mina=prim();
maxn=pppp();
printf("Case %d: ",aaaa++);
if((mina+maxn)%2==0)printf("%d\n",(mina+maxn)/2);
else printf("%d/2\n",mina+maxn);
}
return 0;
}