poj 1125 简单的floyd应…

来源:互联网 发布:手机怎样淘宝购物 编辑:程序博客网 时间:2024/05/29 04:33
题意有点模糊
题意:要给所有人传递一个消息 , 问让所有多都知道的这个消息 , 应该让谁传递 ,然后输出这个人传递消息所需要的时间(消息可以同时向多个人传递)

//floyd算法同时使用于有向、无向图 , 我允许环存在负权, 但是不允许存在负权回路

#include
#include
#include
#include
#include
using namespace std;

const int INF = 0xfffffff;
#define maxn 110

int grap[maxn][maxn]; //邻接矩阵存储图
int n , m;
int dist[maxn][maxn]; //记录从所有点之间的最短距离

void init()  // 对一些数据进行初始化
{
    int i ,j;
    for(i = 0; i<= n; i++)
       for(j = 0; j<= n; j++)
          grap[i][j] =INF , grap[i][i] = 0;
}

void floyd()
{
    int i , j ,k;
    for(i = 1; i<= n; i++) //初始化, 一开始每个点与点之间的路径长度 就等于grap中的长度
       for(j = 1; j<= n; j++)
          dist[i][j] =grap[i][j];
      
       for(k = 1; k<= n; k++) //每个点都要成为中间点
          for(i = 1; i<= n; i++)
             for(j = 1; j<= n; j++)
             {
                if(k ==i ||k == j)  continue;
               if(dist[i][k]+dist[k][j] < dist[i][j])
                   dist[i][j] =dist[i][k] + dist[k][j];
             }
}

int main()
{
   while(scanf("%d" , &n) != EOF)
    {
       if(n ==0)  break;
      init();
       int i , x ,y , z , j;
      
       for(i = 1; i<= n; i++) //对有向图进行存储
       {
          scanf("%d" ,&x);
             for(j = 1; j<= x; j++)
             {
                scanf("%d%d" , &y , &z);
               if(grap[i][y] > z)
                   grap[i][y] =z;
             }
       }
      floyd();
       int maxy =INF , pe = 1;
       for(i = 1; i<= n; i++)
       {
          int gh =0;
          for(j = 1; j<= n; j++)
             if(i != j&& dist[i][j] > gh)  gh =dist[i][j];
          if(maxy >gh)
          {
             maxy =gh;
             pe =i;
          }
       }
       if(maxy ==INF)
         cout<<"disjoint"<<endl;
       else
          printf("%d%d\n" , pe , maxy);
    }
    
    return0;
}


0 0
原创粉丝点击