【最小生成树】神母牛的实验

来源:互联网 发布:淘宝假发多少钱 编辑:程序博客网 时间:2024/06/04 18:44

3.神母牛的实验(experiment.pas/c/cpp)

【题目描述】

有一天神母牛爪子抓手机想做一个实验,这个实验呢,就是点亮小灯泡呐。

为了显示她的NewBe之处,她用了一块金属板来安装这些灯泡(这个金属板可以视为接地线),并且让这些灯泡随机分布。不过她似乎忘记了添加导线和电源- -、

于是神母牛爪子抓手机想到了这样两个个办法:

1、  直接给某个灯泡接上火线,这会消耗她一定的心情值,用V表示;

2、  将某两个灯泡用导线连接,这也会消耗她一定的心情值,用P表示;

如果神母牛爪子抓手机的心情过差,她就会到机房虐人……把人虐得死去活来。如果所有的灯泡没有全部被点亮,那么她的心情值会直接跌到临界值以下,她还是会来机房虐人,把人虐得死去活来……

这是大家都不希望看见的,所以,你需要找到一个方案,使所有的灯泡亮起来,并且为了自身安全着想,你要使神母牛爪子抓手机消耗的心情值尽量小,不然你就完了……

【输入格式】

输入文件experiment.in,第一行一个整数N,表示小灯泡总数,接下来有N行,表示直接给i号灯泡接火线消耗的心情值Vi,再接下来,一个N*N的矩阵,表示第i号灯泡与第j号灯泡之间连一根导线所消耗的心情值(保证有p[I,j]=p[j,i],当然,p[I,i]=0)

【输出格式】

输出文件experiment.out,只有一行,表示最小的心情值消耗

【样例输入】

4

5

4

4

3

0 2 2 2

2 0 3 3

2 3 0 4

2 3 4 0

【样例输出】

9

【数据范围】

对于100%的数据,0<N<=300。



简单题。加上一个超级源,到每个点连边,权值为连火线的代价,求最小生成树。


#include <cstdio>#include <string>#include <cstring>long dist[310];long map[310][310];bool used[310];long ans = 0;long getint(){long rs=0;bool sgn=1;char tmp;do tmp = getchar();while (!isdigit(tmp)&&tmp-'-');if (tmp=='-'){tmp=getchar();sgn=0;}do rs=(rs<<3)+(rs<<1)+tmp-'0';while (isdigit(tmp=getchar()));return sgn?rs:-rs;}long n;void prim(){for (long i=1;i<n+1;i++){dist[i] = map[n][i];}used[n] = true;for (long l=1;l<n;l++){long nearest = 0x7f7f7f7f;long k = 0;for (long i=1;i<n+1;i++){if (dist[i] < nearest && !used[i]){k = i;nearest = dist[i];}}ans += nearest;used[k] = true;for (long i=1;i<n+1;i++){if (!used[i] && dist[i]>map[k][i]){dist[i] = map[k][i];}}}}int main(){freopen("experiment.in","r",stdin);freopen("experiment.out","w",stdout);n = getint();for (long i=1;i<n+1;i++){map[n+1][i] = getint();}for (long i=1;i<n+1;i++){for (long j=1;j<n+1;j++){map[i][j] = getint();}}n++;prim();printf("%ld",ans);return 0;}


原创粉丝点击