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     }

 

posted @ 2017-04-19 16:49  ioioioioioio  阅读(142)  评论(0编辑  收藏  举报