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;
}
#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;
}
相关文章推荐
- pku 1125 Stockbroker Grapevine 第一周训练——最短路
- (最短路-floyd+邻接矩阵)PKU-1125 Stockbroker Grapevine
- pku1125 Stockbroker Grapevine
- PKU ACM 1125
- PKU1125 最短路径 Floyd-Warshall算法
- Pku acm 1125 Stockbroker Grapevine 数据结构题目解题报告(八)---- 弗洛伊德(floyd)算法
- 最短路水题= = PKU1125
- pku 1125—Stockbroker Grapevine
- Pku acm 1125 Stockbroker Grapevine 动态规划题目解题报告(十九)
- pku1125: Stockbroker Grapevine
- pku_1125_Stockbroker Grapevine
- 多源最短路pku1125
- pku 1125
- pku1125 Floyd求每两点间的最短路
- PKU 1125 【简单floyd】
- pku ACM 1125
- 开始做图论题目“Stockbroker Grapevine”PKU1125
- pku 1125 strokers
- pku1125 Stockbroker Grapevine
- pku 1125 Stockbroker Grapevine(Floyd-Warshall)