[Swust OJ 412]--医院设置(floyd算法)
2024-08-26 19:20:04
题目链接:http://acm.swust.edu.cn/problem/412/
Time limit(ms): 1000 Memory limit(kb): 65535
Description
设有一棵二叉树,如图:
其中,圈中的数字表示结点中居民的人口。圈边上数字表示结点编号,现在要求在某个结点上建立一个医院,使所有居民所走的路程之和为最小,同时约定,相信接点之间的距离为1。如上图中,若医院建在:
1处,则距离和=4+12+2*20+2*40=136
3处,则距离和=4*2+13+20+40=81
……
Input
第一行一个整数n,表示树的结点数。(n≤100)
接下来的n行每行描述了一个结点的状况,包含三个整数,整数之间用空格(一个或多个)分隔,其中:第一个数为居民人口数;第二个数为左链接,为0表示无链接;第三个数为右链接。
接下来的n行每行描述了一个结点的状况,包含三个整数,整数之间用空格(一个或多个)分隔,其中:第一个数为居民人口数;第二个数为左链接,为0表示无链接;第三个数为右链接。
Output
一个整数,表示最小距离和。
Sample Input
5
13 2 3
4 0 0
12 4 5
20 0 0
40 0 0
|
Sample Output
81 |
解题思路:传说中只有5行的floyd算法(链接)带进去瞎搞就可以了·--,恩~~看题中的样例数据,下标从1开始的(被坑了)~~~
代码如下:
#include <iostream>
#include <algorithm>
#include <cstring>
using namespace std;
#define inf 0x3f3f3f int n, ptr[], mpt[][], L, R;
void Floyd(){
for (int k = ; k <= n; k++){
for (int i = ; i <= n; i++){
for (int j = ; j <= n; j++)
mpt[i][j] = min(mpt[i][j], mpt[i][k] + mpt[k][j]);
}
}
}
int main(){
int i, j, sum, tmp;
while (cin >> n){
sum = inf;
memset(mpt, inf, sizeof(mpt));
for (i = ; i <= n; i++){
cin >> ptr[i] >> L >> R;
mpt[L][i] = mpt[i][L] = mpt[R][i] = mpt[i][R] = ;
}
Floyd();
for (i = ; i <= n; i++){
tmp = ;
for (j = ; j <= n; j++) {
if (i != j)
tmp += mpt[i][j] * ptr[j];
}
sum = min(sum, tmp);
}
cout << sum << endl;
}
return ;
}
最新文章
- linux history命令显示时间
- How do I enable log4net internal debugging?
- 时间改成24小时制 和pc mobile链接自动转化
- QT国际化 一 (lupdate/linguits/lrelease)
- 使用 IMQ+HTB+iptable 统一流量控制心得
- iOS开发编译报错、常见问题(实时更新)
- 一机双mysql的安装和启动注意事项目
- Matlab与C/C++联合编程之Matlab以MEX方式调用C/C++代码(四)
- 使用IDENTITY列属性和Sequence对象
- php异或加密解密算法的实现
- hdu 4893 Wow! Such Sequence!
- SVN解锁失败的解决办法
- HTML day01基础总结
- Ocelot中文文档-架构图
- log4net使用封装,无缝切换 dotnet 和 dotnetcore
- 反射与jvm
- [Linux] awk基础编程
- 第七节:利用CancellationTokenSource实现任务取消和利用CancellationToken类检测取消异常。
- validation-api各注解的用法
- AFNetworking Delete请求,报参数为空的错误