codevs1020

来源:互联网 发布:绝地求生 技巧 知乎 编辑:程序博客网 时间:2024/06/08 09:08

题目地址:http://codevs.cn/problem/1020/

分析:

枚举+floyd

代码:

#include <stdio.h>  

#include <string.h>  #define MAXN 500  #define INF 10000000  int g[MAXN][MAXN],n; //g[i][j]=从i到j的最短路  int min(int a,int b)  {      if(a<b)          return a;      return b;  }  void init()  {      int a,b,t;      memset(g,-1,sizeof(g));      scanf("%d",&n);      while(scanf("%d%d%d",&a,&b,&t)!=EOF)      {          g[a][b]=t;          g[b][a]=t;      }  }  void floyd() //求各点间最短路径  {      int i,j,k;      for(k=1;k<=n;k++)      {          for(i=1;i<=n;i++)          {              if(i!=k)              {                  for(j=1;j<=n;j++)                  {                      if(i!=j&&j!=k&&g[i][k]!=-1&&g[k][j]!=-1)                      {                          if(g[i][j]>g[i][k]+g[k][j]||g[i][j]==-1)                              g[i][j]=g[i][k]+g[k][j];                      }                  }              }          }      }  }  int getmax(int a,int b) //获得以蜘蛛在a、b两点找到飞蛾的最坏情况(两点各到另一点的距离最小值 的最大值)  {      int i,f=0;      for(i=1;i<=n;i++)          if(min(g[a][i],g[b][i])>f)              f=min(g[a][i],g[b][i]);      return f;  }  void solve() //枚举两个蜘蛛出现的所有可能位置的最坏情况getmax最小值  {      int a,b,minn=INF,mina,minb;      for(a=1;a<=n;a++)      {          for(b=1;b<=n;b++)          {              if(a!=b)              {                  if(getmax(a,b)<minn)                  {                      mina=a;                      minb=b;                      minn=getmax(a,b);                  }              }          }      }      printf("%d %d\n",mina,minb);  }  int main()  {      init();      floyd();      solve();      return 0;  }  

0 0