POJ 1125

来源:互联网 发布:大话西游3手游下载mac 编辑:程序博客网 时间:2024/05/17 01:50
//11099198c00h00g1125Accepted412K16MSG++1750B2012-12-11 16:08:05//dij函数用来返回最小值中的最大值 #include<stdio.h>#include<stdlib.h>#include<string.h>int d[105];int mat[105][105];int visited[105]; #define INF 999999999int n,m;//查找最短距离 int dij(int start){     memset(visited,0,sizeof(visited));    for(int i=0;i<n;i++)        d[i]=mat[start][i];    visited[start]=1;    for(int i=0;i<n-1;i++){        //查找最小的d值         int v=-1,min;        min=INF;        for(int j=0;j<n;j++){            if(visited[j]==0&&d[j]<min){                min=d[j];                v=j;            }        }        //加上这一句就ac了,v周围可能没有元素         if(v==-1)            break;        visited[v]=1;        //查找出来之后进行松弛操作         for(int j=0;j<n;j++){            if(visited[j]==0&&d[j]>d[v]+mat[v][j]){                d[j]=d[v]+mat[v][j];            }        }    }    int min=-1;    for(int i=0;i<n;i++){        if(d[i]>min)            min=d[i];    }    return min;}int main(){    while(scanf("%d",&n)!=EOF&&n){        for(int i=0;i<n;i++){            for(int j=0;j<n;j++){                if(i!=j)                    mat[i][j]=INF;                else                    mat[i][j]=0;            }        }        for(int i=0;i<n;i++){            scanf("%d",&m);            int node,time;            for(int j=0;j<m;j++){                scanf("%d%d",&node,&time);                node--;                mat[i][node]=time;            }        }        int res,ve;        int min=INF;        for(int i=0;i<n;i++){            res=dij(i);            if(res<min){                min=res;                ve=i;            }        }        if(min==INF)            printf("disjoint\n");        else            printf("%d %d\n",ve+1,min);    }    return 0;    }

原创粉丝点击