题目给出了有向图的邻接表,求哪个点到其他所有点的距离之和最小,以及该点到其他点的最短距离的最大值。
才100个点,用flody跑出所有点对的最短距离,然后O(n)一遍一遍的找。
#include<iostream>
#include<cstdio>
#include<string>
#include<cstring>
#include<algorithm>
#include<queue>
#include<cmath>
#include<cmath>
#include<map>
#include<set>
#include<stack>
#include<vector>
#include<climits>
#define maxn 200
#define LL long long
using namespace std;
int _map[maxn][maxn];
LL sum[maxn];
bool flody(int &pos,int &len,int n,int MAX)
{
for(int k=1;k<=n;++k)
{
for(int i=1;i<=n;++i)
{
for(int j=1;j<=n;++j)
{
if(_map[i][j]>_map[i][k]+_map[k][j])
_map[i][j]=_map[i][k]+_map[k][j];
}
}
}
memset(sum,0,sizeof(sum));
for(int i=1;i<=n;++i)
{
for(int j=1;j<=n;++j)
{
if(_map[i][j]<MAX )
{
sum[i]+=_map[i][j];
}
else
{
sum[i]=-1;
break;
}
}
}
LL mmin=LLONG_MAX;
bool flag=false;
for(int i=1;i<=n;++i)
{
if(sum[i]!=-1 && sum[i]<mmin)
{
flag=true;
mmin=sum[i];
pos=i;
}
}
for(int i=1;i<=n;++i)
{
if(i==pos)
continue;
len=max(len,_map[pos][i]);
}
return flag;
}
int main()
{
int n;
while(scanf("%d",&n),n!=0)
{
memset(_map,0x3f,sizeof(_map));
int MAX=_map[0][0];
for(int i=0;i<=n;++i)
_map[i][i]=0;
for(int i=1;i<=n;++i)
{
int m;
scanf("%d",&m);
for(int j=0;j<m;++j)
{
int v,w;
scanf("%d%d",&v,&w);
_map[i][v]=w;
}
}
int pos,len=0;
bool flag=flody(pos,len,n,MAX);
if(flag)
printf("%d %d\n",pos,len);
else
printf("disjoint\n");
}
}