首页 > 代码库 > usaco oct09 Watering Hole
usaco oct09 Watering Hole
Farmer John希望把水源引入他的N (1 <= N <= 300) 个牧场,牧场的编号是1~N.他将水源引入某个牧场的方法有两个,一个是在牧场中打一口井,另一个是将这个牧场与另一个已经有水源的牧场用一根管道相连.
在牧场i中打井的费用是W_i (1 <= W_i <= 100000).
把牧场i和j用一根管道相连的费用是P_ij (1 <= P_ij <= 100000, P_ij = P_ji, P_ii = 0).
请你求出Farmer John最少要花多少钱才能够让他的所有牧场都有水源.
输入:
第1行: 一个正整数N.
* 第2~N+1行: 第i+1行包含一个正整数W_i.
* 第N+2~2N+1行: 第N+1+i行包含N个用空格分隔的正整数,第j个数表示P_ij.
输出:
总共有四个牧场.在1号牧场打一口井需要5的费用,在2或者3号牧场打井需要4的费用,在4号牧场打井需要3的费用.在不同的牧场间建立管道需要2,3或4的费用.
先找到打井花费最少的牧场作为起点,然后将起点到达每个牧场最短距离dis的初值赋为各个牧场打井的花费,最后写一个Prim算法即可.
调试代码我没有删掉..
1 #include<iostream> 2 #include<cstring> 3 #include<cstdio> 4 using namespace std; 5 long long a[310][310],dis[310],n,s,sumn=0,minx=99999999; 6 bool vis[310]; 7 int main() 8 { 9 memset(vis,0,sizeof(vis));10 memset(dis,10,sizeof(dis));11 cin>>n;12 for(int i=1;i<=n;i++)13 {14 cin>>dis[i];15 if(dis[i]<minx)16 {17 minx=dis[i];18 s=i;19 //cout<<"WWW"<<s<<"WWW"<<endl;20 }21 }22 sumn=sumn+dis[s];23 for(int i=1;i<=n;i++)24 for(int j=1;j<=n;j++)25 {26 cin>>a[i][j];27 a[j][i]=a[i][j];28 }29 for(int i=1;i<=n;i++)30 {31 if(a[s][i]<dis[i])32 dis[i]=a[s][i];33 }34 vis[s]=1;35 for(int i=2;i<=n;i++)36 {37 long long minn=999999999,c=0;38 for(int j=1;j<=n;j++)39 if((!vis[j])&&(dis[j]<minn))40 {41 minn=dis[j];42 c=j;43 }44 vis[c]=1;45 //cout<<"!"<<minn<<"!"<<endl;46 sumn+=minn;47 for(int j=1;j<=n;j++)48 if((a[c][j]<dis[j])&&(!vis[j]))49 dis[j]=a[c][j];50 }51 cout<<sumn<<endl;52 return 0;53 }
usaco oct09 Watering Hole
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。