joj 1002: Stockbroker Grapevine(最短路floyd)

//我做的第一道正规的图论题。题目很长,大概意思就是谣言由1点可以同时通过边传到多个点花费的时间是每边的权值,要求从开始给第一个传谣言到所有人都被传到,花费时间最少的情况的总时间和要传给谁,如果图不是连通的要printf("disjoint/n")

//主要思路是floyd求出所有点间的最短路,在以其中一点为起点保存其到其他点的最大路径(前提是所有路径存在),找这样的最大路径最少的点和时间

#include <cstdio>
#include <memory.h>
using namespace std;
const int maxn=103;
const int inf=1<<25;
int a[maxn][maxn];
int i,j,n,k;
int main ()
{
    int sb;
    while (scanf("%d",&sb)!=EOF && sb)
    {
        memset(a, -1 , sizeof(a));
        int u,v,vl;
        for (u=1; u<=sb ; u++)
        {
            scanf("%d",&n);
            while(n--)
            {
                a[u][u]=0;
                scanf("%d%d",&v,&vl);
                a[u][v]=vl;
            }
        }
        for (k=1 ; k<=sb ; k++)
          for (i=1; i<=sb ; i++)
            for (j=1 ; j<=sb ;j++)
              if(a[i][k]>=0 && a[k][j]>=0 &&(a[i][j] <0 || a[i][j] > a[i][k]+a[k][j]))
                  a[i][j]=a[i][k]+a[k][j];
        int ans_u=1,ans_min=inf,tmp_u=1,tmp_min;
        bool flag=0,tmp;
        //for(u=1;u<=sb;u++)for(v=1;v<=sb;v++)printf("a[%d][%d]=%d%c",u,v,a[u][v],v==sb?'/n':' ');
        for( u=1 ; u<=sb ; u++)
        {
             tmp_min=a[u][1];
          for( v=1 ,tmp=1; v<=sb ; v++)
          {
            
             if(a[u][v]>=0)
             {
                 tmp_min>?=a[u][v];
                 if(v==sb) flag=1;
             }
             else {tmp=0;break;}
          }
          //printf("tmp_min=%d/n",tmp_min);
          if(!tmp)continue;
          if(tmp_min>=0 && ans_min>tmp_min)
          { ans_u=u;ans_min=tmp_min;}
        }
        if(flag)printf("%d %d/n",ans_u,ans_min);
        else printf("disjoint/n");
    }
    return 0;
}
/*
5
3 4 1 2 8 5 3
2 5 8 4 1
4 1 1 4 10 2 1 5 2
0
2 2 5 1 5

*/

你可能感兴趣的:(joj 1002: Stockbroker Grapevine(最短路floyd))