您的位置:首页 > 其它

pku1125

2007-09-06 20:41 417 查看
最短路径(多源floyd_warshall邻接阵) 模板很爽

#include <iostream>

using namespace std;

//多源最短路径,floyd_warshall算法,复杂度O(n^3)

//求出所有点对之间的最短路经,传入图的大小和邻接阵

//返回各点间最短距离MIN[]和路径pre[],pre[i][j]记录i到j最短路径上j的父结点

//可更改路权类型,路权必须非负!

#define MAXN 110

#define inf 1000000000

typedef int elem_t;

void floyd_warshall(int n,elem_t mat[][MAXN],elem_t MIN[][MAXN],int pre[][MAXN]){

int i,j,k;

for (i=0;i<n;i++)

for (j=0;j<n;j++)

MIN[i][j]=mat[i][j],pre[i][j]=(i==j)?-1:i;

for (k=0;k<n;k++)

for (i=0;i<n;i++)

for (j=0;j<n;j++)

if (MIN[i][k]+MIN[k][j]<MIN[i][j])

MIN[i][j]=MIN[i][k]+MIN[k][j],pre[i][j]=pre[k][j];

}

elem_t graph[MAXN][MAXN],MIN[MAXN][MAXN];

int pre[MAXN][MAXN];

int n;

bool init()

{

int i,j,k,t,c;

cin>>n;

if (n==0) return false;

for (i=1;i<=n;i++)

for (j=1;j<=n;j++)

graph[i-1][j-1]=inf;

for (i=1;i<=n;i++)

{

cin>>k;

for (j=0;j<k;j++)

{

cin>>t>>c;

graph[i-1][t-1]=c;

}

}

return true;

}

int get_ans(int &u)

{

int i,j,m;

floyd_warshall(n,graph,MIN,pre);

int ans=inf;

for (i=0;i<n;i++)

{

m=0;

for (j=0;j<n;j++)

if (i!=j)

if (MIN[i][j]>m)

m=MIN[i][j];

if (m<ans)

{ ans=m;u=i;}

}

return ans;

}

int main()

{

while (init())

{

int x;

int ans=get_ans(x);

if (ans==inf)

cout<<"disjoint"<<endl;

else

cout<<x+1<<' '<<ans<<endl;

}

return 0;

}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: