您的位置:首页 > 其它

ACM 服务点设置(水弗洛伊德题)

2014-08-15 17:17 204 查看


3. 服务点设置

★☆ 输入文件:
djsa.in
输出文件:
djsa.out
简单对比

时间限制:1 s 内存限制:128 MB

问题描述

为了进一步普及九年义务教育,政府要在某乡镇建立一所希望小学,该乡镇共有n个村庄,村庄间的距离已知,请问学校建在哪个村庄最好?(好坏的标准是学生就近入学,即在来上学的学生中,以最远的学生走的路程为标准。或者说最远的学生与学校的距离尽可能的小。)



【输入格式】
输入由若干行组成,第一行有两个整数,n(1≤n≤100)、m(1≤m≤n*n);n表示村庄数,m表示村庄间道路数。第2至m+1行是每条路的信息,每行三个整数,为道路的起点、终点和两村庄间距离。(村庄从0开始编号)
【输出格式】
一个整数,学校所在村庄编号(如果两个村庄都适合建立学校,选择编号小的村庄建学校)。
【输入样例】
输入文件名:djsa.in
6 8

0 2 10

0 4 30

0 5 100

1 2 5

2 3 50

3 5 10

4 3 20

4 5 60
【输出样例】
输出文件名:djsa.out
4

注意重边选最小权值,矩阵赋值时d[i][i]=0,自己到自己的距离为0

#include <iostream>

#include <cstring>

#include <cstdio>

using namespace std;

#define MAX_N 100

#define INF 99999999

int n,m;

int d[MAX_N][MAX_N];

struct

{

int a,b;

int z;

} ans;

int cnt;

int main()

{

freopen("djsb.in","r",stdin);

freopen("djsb.out","w",stdout);

cin>>n>>m;

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

{

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

{

if(i!=j)

d[i][j]=INF;

else

d[i][j]=0;

}

}

for(int i=0;i<m;i++)

{

int b,e,v;

cin>>b>>e>>v;

d[e][b]=d[b][e]=min(v,d[b][e]);

}

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

{

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

{

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

d[i][j]=min(d[i][j],d[i][k]+d[k][j]);

}

}

int maxz;

int minz=INF;

cnt=0;

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

{

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

{

maxz=0;

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

{

maxz=max(maxz,min(d[i][k],d[j][k]));

}

if(minz>maxz)

{

ans.a=i;

ans.b=j;

ans.z=maxz;

minz=maxz;

}

}

}

cout<<ans.a<<" "<<ans.b<<endl;

return 0;

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