zoj 1082

mac2022-06-30  29

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

我先用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;}

转载于:https://www.cnblogs.com/miaycl/archive/2010/07/28/1786568.html

相关资源:JAVA上百实例源码以及开源项目
最新回复(0)