P1364医院设置

 

 1 #include<iostream>
 2 #include<cstdio>
 3 #define  inf  0x3f3f3f3f
 4 using namespace std;
 5 int map[105][105],a[105];
 6 int main(){
 7     int n;
 8     scanf("%d",&n);
 9     int x,y;
10     for(int i=1;i<=n;i++){
11         for(int j=1;j<=n;j++){
12             if(i==j)
13                 map[i][j]=0;
14             else
15                 map[i][j]=inf;    
16         }
17     }
18     for(int i=1;i<=n;i++){
19         scanf("%d%d%d",&a[i],&x,&y);
20         map[i][x]=1;
21         map[x][i]=1;
22         map[i][y]=1;
23         map[y][i]=1;
24     }
25     for(int k=1;k<=n;k++){
26         for(int i=1;i<=n;i++){
27             for(int j=1;j<=n;j++){
28                 if(map[i][k]+map[k][j]<map[i][j])
29                     map[i][j]=map[i][k]+map[k][j];
30             }
31         }
32     }
33     int mina=inf;
34     for(int i=1;i<=n;i++){
35         int total=0;
36         for(int j=1;j<=n;j++){
37             total+=map[i][j]*a[j];
38         }
39         if(total<mina)
40             mina=total;
41     }
42     cout<<mina;
43     return 0;
44 } 

这题数据量较小,用弗洛伊德就可以,用邻接矩阵存图,弗洛伊德计算出多源最短路径,然后枚举每一个点作为医院的时候的距离和,找到最小的,(简直就是纯暴力)

原文地址:https://www.cnblogs.com/fate-/p/12812716.html