好久没有写题了,所以这一道简单题都错的离谱,调试了好久。

我先用Dijstra和Floyd分别写了一次,其实质差不多;只是Dijstra是一维,需要多次调用;而Floyd是二维,调用一次就行了。。。

大意:

以不同的点作为源点,找出此源点与其他各点的单源最短路径中的最大值,然后在这几个最大值中找出最小值,如果最后找出的最小值是定义的INF,就说明此图不连通,输出“disjoint”,否则输出是最大值最小的源点和该最大值中的最小值

我设计的测试数据:

1

0

3

1 2 3

2 1 2

0

0

预计结果:

1 0

disjoint

******************************************************************************************

#include<iostream>
using namespace std;
#define DEBUG 1

const int MaxSize=101,INF=10001;
int Map[MaxSize][MaxSize],dis[MaxSize];
bool used[MaxSize];
int num;

void init()
{
    int i,j;
    for( i=1; i<=num; ++i ){
        for( j=i; j<=num; ++j ){
            Map[i][j] = Map[j][i] = INF ;}
        Map[i][i] = 0 ;
    }   
}

void Dijstra(int n){
    int i,j,index,Min;
    for(i=1;i<=num;i++){
        dis[i]=Map[n][i];
        used[i]=false;}
    used[n]=true;
    index=n;
    for(i=1;i<=num;i++){
        Min=INF;
        for(j=1;j<=num;j++){
            if(!used[j]&&Min>=dis[j]){
                Min=dis[j];
                index=j;}
        }      
        used[index]=true;
        for(j=1;j<=num;j++){
            if(!used[j]&&dis[j]>(dis[index]+Map[index][j]))
                 dis[j]=dis[index]+Map[index][j];}
     }
}

int main()
{
    #if DEBUG
    freopen("C:\\Documents and Settings\\Administrator\\桌面\\in.txt","r",stdin);
    freopen("C:\\Documents and Settings\\Administrator\\桌面\\out.txt","w",stdout);
    #endif
   
    int contacts,time,i,j,k,m,len,q,index;
    while(cin>>num){
        if(num==0)break;
        init();
        k=1;q=INF;
        //输入数据
        while(k<=num){
            cin>>m;
            for(i=0;i<m;i++){
                cin>>contacts>>time;
                Map[k][contacts]=time;}
            k++;}
      
        //处理数据
        for(i=1;i<=num;i++){
            Dijstra(i);
            len=0;
            for(j=1;j<=num;j++){
                if(len<dis[j])len=dis[j];
             }
            if(q>len){
                q=len;
                index=i;}
            }
            //输出结果
        if(q==INF)cout<<"disjoint"<<endl;
        else cout<<index<<" "<<q<<endl;
    }
    return 0;
}    

*********************************************************************************************

************************************************************************************************

#include<iostream>
using namespace std;

#define DEBUG 0

const int MaxSize=101,INF=10001;
int Map[MaxSize][MaxSize],G[MaxSize][MaxSize];
int num;

void init()
{
    int i,j;
    for( i=1; i<=num; ++i ){
        for( j=i; j<=num; ++j ){
            Map[i][j] = Map[j][i] = INF ;}
        Map[i][i] = 0 ;
    }   
}

void Floyd()
{
    int i,j,k;
    for(i=1;i<=num;i++)
       for(j=1;j<=num;j++)
           G[i][j]=Map[i][j];
    for(k=1;k<=num;k++){
      for(i=1;i<=num;i++){
         for(j=1;j<=num;j++){
            if(G[i][k]<INF&&G[k][j]<INF&&G[i][j]> (G[i][k]+G[k][j]))
                G[i][j]=G[i][k]+G[k][j];
            }
         }
     }
}

int main()
{
    #if DEBUG
    freopen("C:\\Documents and Settings\\Administrator\\桌面\\in.txt","r",stdin);
    freopen("C:\\Documents and Settings\\Administrator\\桌面\\out.txt","w",stdout);
    #endif
   
    int contacts,time,m,q,i,j,k,min,index;
    while(cin>>num){
        if(num==0)break;
        init();
        k=1;
        while(k<=num){
        cin>>m;
        for(i=0;i<m;i++){
            cin>>contacts>>time;
            Map[k][contacts]=time;}
        k++;
    }
   
       Floyd();
       q=INF;
       for(i=1;i<=num;i++){
         min=0;
         for(j=1;j<=num;j++){
            if(G[i][j]>min)
                min=G[i][j];
                }
         if(q>min){
                q=min;
                index=i;}
        }
        if(q==INF) cout<<"disjoint"<<endl;
        else cout<<index<<" "<<q<<endl;
        }
    return 0;
}

posted on 2010-07-28 09:16  yuanyin  阅读(210)  评论(0编辑  收藏  举报