比赛 |
HAOI2009 模拟试题3 |
评测结果 |
AAAAA |
题目名称 |
医院设置 |
最终得分 |
100 |
用户昵称 |
Citron酱 |
运行时间 |
0.000 s |
代码语言 |
C++ |
内存使用 |
0.00 MiB |
提交时间 |
2012-06-28 17:18:48 |
显示代码纯文本
#include <cstdio>
#include <climits>
#define I_F "hospital.in"
#define O_F "hospital.out"
const short MAXn=100;
short n;
int s[MAXn];
short map[MAXn][MAXn]={{0}};
long ans=LONG_MAX;
void Input();
void Floyd();
void Search();
void Output();
int main()
{
Input();
Floyd();
Search();
Output();
return 0;
}
void Input()
{
short t;
freopen(I_F,"r",stdin);
scanf("%hd",&n);
for (short i=0; i<n; ++i)
{
scanf("%d%hd",&s[i],&t);
if (t>0)
map[i][t-1]=map[t-1][i]=1;
scanf("%hd",&t);
if (t>0)
map[i][t-1]=map[t-1][i]=1;
}
}
void Floyd()
{
for (int k=0; k<n; ++k)
for (int i=0; i<n; ++i)
if (map[i][k]>0)
for (int j=0; j<n; ++j)
if (map[k][j]>0 && i!=j && map[i][j]==0)
map[i][j]=map[i][k]+map[k][j];
}
void Search()
{
long t;
for (int i=0; i<n; ++i)
{
t=0;
for (int j=0; j<n; ++j)
t+=s[j]*map[j][i];
ans=(ans<t)?ans:t;
}
}
void Output()
{
freopen(O_F,"w",stdout);
printf("%ld\n",ans);
}