185. [USACO Oct08] 挖水井
185. [USACO Oct08] 挖水井
★★ 输入文件:water.in
输出文件:water.out
简单对比
时间限制:1 s
内存限制:128 MB
农夫约翰决定给他的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)。
请确定农夫约翰为了完成浇灌所有的牧场所需的最小的总花费。
题目名称:water
输入格式:
- 第1行:一个单独的整数n。
- 第2..n+1行:第i+1行包含一个单独的整数w_i。
- 第n+2..2n+1行:第n+1+i行包含n个用空可分开的整数;其中第j个数是p_ij。
输入样例(file water.in):
4 5 4 4 3 0 2 2 2 2 0 3 3 2 3 0 4 2 3 4 0
输入说明:
这里有4个牧场,修井和修管道的代价如图。
输出格式:
- 第1行:一个单独的整数,表示花费。
输出样例(file water.out):
9
输出说明:
农夫约翰可以在第4个牧场修井,并且将每个牧场和第一个连接起来,这样,花费是3+2+2+2=9。
20 #include<iostream> 21 #include<cstdio> 22 #include<algorithm> 23 using namespace std; 24 const int N=100001; 25 const int maxn=0x7fffffff; 26 int fa[N]; 27 struct node{ 28 int u,v,w; 29 }e[N]; 30 int find(int x) 31 { 32 if(fa[x]!=x) 33 { 34 fa[x]=find(fa[x]); 35 } 36 return fa[x]; 37 } 38 void un(int x,int y) 39 { 40 int r=find(x); 41 int rr=find(y); 42 fa[r]=rr; 43 } 44 int cmp( node a,node b) 45 { 46 return a.w<b.w; 47 } 48 int n; 49 int tot; 50 int w[N]; 51 int num=1; 52 int main() 53 { 54 freopen("water.in","r",stdin); 55 freopen("water.out","w",stdout); 56 scanf("%d",&n); 57 for(int i=1;i<=n;i++) 58 { 59 fa[i]=i; 60 } 61 for(int i=1;i<=n;i++) 62 { 63 scanf("%d",&w[i]); 64 } 65 for(int i=1;i<=n;i++) 66 { 67 for(int j=1;j<=n;j++) 68 { 69 scanf("%d",&e[num].w); 70 e[num].u=i; 71 e[num].v=j; 72 num++; 73 } 74 } 75 for(int i=1;i<=n;i++) 76 { 77 e[num].u=i; 78 e[num].v=n+1; 79 e[num].w=w[i]; 80 num++; 81 } 82 sort(e+1,e+num,cmp); 83 long long int ans=0; 84 int k=0; 85 for(int i=1;i<=num;i++) 86 { 87 if(find(e[i].u)!=find(e[i].v)) 88 { 89 un(e[i].u,e[i].v); 90 ans+=e[i].w; 91 k++; 92 } 93 if(k==n) 94 { 95 break; 96 } 97 } 98 printf("%lld",ans); 99 fclose(stdin); 100 fclose(stdout); 101 return 0; 102 } 103 104 #include<iostream> 105 #include<cstdio> 106 #include<algorithm> 107 using namespace std; 108 const int N=100001; 109 const int maxn=0x7fffffff; 110 int fa[N]; 111 struct node{ 112 int u,v,w; 113 }e[N]; 114 int find(int x) 115 { 116 if(fa[x]!=x) 117 { 118 fa[x]=find(fa[x]); 119 } 120 return fa[x]; 121 } 122 void un(int x,int y) 123 { 124 int r=find(x); 125 int rr=find(y); 126 fa[r]=rr; 127 } 128 int cmp( node a,node b) 129 { 130 return a.w<b.w; 131 } 132 int n; 133 int tot; 134 int w[N]; 135 int num=1; 136 int main() 137 { 138 freopen("water.in","r",stdin); 139 freopen("water.out","w",stdout); 140 scanf("%d",&n); 141 for(int i=1;i<=n;i++) 142 { 143 fa[i]=i; 144 } 145 for(int i=1;i<=n;i++) 146 { 147 scanf("%d",&w[i]); 148 } 149 for(int i=1;i<=n;i++) 150 { 151 for(int j=1;j<=n;j++) 152 { 153 scanf("%d",&e[num].w); 154 e[num].u=i; 155 e[num].v=j; 156 num++; 157 } 158 } 159 for(int i=1;i<=n;i++) 160 { 161 e[num].u=i; 162 e[num].v=n+1; 163 e[num].w=w[i]; 164 num++; 165 } 166 sort(e+1,e+num,cmp); 167 long long int ans=0; 168 int k=0; 169 for(int i=1;i<=num;i++) 170 { 171 if(find(e[i].u)!=find(e[i].v)) 172 { 173 un(e[i].u,e[i].v); 174 ans+=e[i].w; 175 k++; 176 } 177 if(k==n) 178 { 179 break; 180 } 181 } 182 printf("%lld",ans); 183 fclose(stdin); 184 fclose(stdout); 185 return 0; 186 }