您的位置:首页 > 其它

信息院赛-小红灌溉 bfs

2015-05-31 20:47 253 查看


Description

小红家有n行田地,每行田地由m块大小为1*1的小田地组成。这些田地构成了一个n*m的矩形。小红在某些小田地里种植了蔬菜。现在小红要给蔬菜灌溉。小红每次可以选择给某一行或某一列的田地灌溉。但是一块种植了蔬菜的田地只能被灌溉一次。由于种种原因,灌溉某行或某列的耗电量不同。所以小红想知道,灌溉完所有蔬菜的耗电量最少为多少?


Input

第一行输入一个数字T,表示输入数据组数。
接下来每组数据:
第一行输入两个数n,m(1<=n<=100,1<=m<=100)
接下来输入n行,每行m个数字。第i行的第j个数为0表示第i行的第j块田地为空地,如果为1,表示第i行的第j列种植有蔬菜。
接下来一行输入n个数字,第i个数字,表示灌溉第i行的耗电量。(每个数字大于0小于等于1000)
接下来一行输入m个数字,第i个数字,表示灌溉第i列的耗电量。(每个数字大于0小于等于1000)



Output

输出T行,第i行输出"Case #i: y",y为第i组数据的答案。


Sample
Input
Raw

1
2 2
1 0
0 1
1 2
2 1


Sample
Output
Raw

Case #1: 2



这道题是我在看完啦啦操之后突然灵光一下想起来怎么做的

哈哈哈哈

因为这里要么只能浇灌行,要么只能浇灌列,所以我们先将图以行列二分,然后将图用邻接表存起来

因为这里是只能选择行或者列,所以我们只需要遍历图的联通块,然后选择行或者列之和的最小值就是了

#include<stdio.h>

#include<iostream>

#include<string>

#include<string.h>

#include<vector>

#include<algorithm>

#include<queue>

#include<stack>

#define nn 1005

#define inff 0x3fffffff

#define mod 1000000007

#define eps 1e-9

using namespace std;

int tu[nn][nn];

struct node

{

    int en;

    int next;

}ma[nn];

int p[nn];

int num;

void init()

{

    memset(p,-1,sizeof(p));

    num=0;

}

void add(int st,int en)

{

    ma[num].en=en;

    ma[num].next=p[st];

    p[st]=num++;

}

int sumcol;

int sumrow;

int n,m;

int col[nn];

int row[nn];

int tot;

queue<int> que;

void bfs()

{

    int use[nn];

    memset(use,false,sizeof(use));

    int a;

    int b;

    tot=0;

    int i;

    for(i=1;i<=n;i++)

    {

        sumcol=0;

        sumrow=0;

        if(use[i]==false)

        {

          a=i;

          if(i<=100)

          {

              sumcol+=col[i];

          }

          else

            sumrow+=row[i-100];

        }

          que.push(a);

          use[a]=true;

          while(!que.empty())

          {

             b=que.front();

             que.pop();

             if(use[b]==false)

             {

                 use[b]=true;

                 if(b<=100)

                {

                  sumcol+=col[b];

                }

                else

                sumrow+=row[b-100];

             }

             for(int j=p[b];j!=-1;j=ma[j].next)

             {

                 if(use[ma[j].en]==false)

                 que.push(ma[j].en);

             }

          }

          tot+=min(sumcol,sumrow);

          sumcol=sumrow=0;

    }

}

int main()

{

    int t;

    int i,j;

    while(scanf("%d",&t)!=EOF)

    {

        for(int o=1;o<=t;o++)

        {

            scanf("%d %d",&n,&m);

            init();

            sumcol=sumrow=0;

            for(i=1;i<=n;i++)

                for(j=1;j<=m;j++)

                scanf("%d",&tu[i][j]);

            for(i=1;i<=n;i++)

                scanf("%d",&col[i]);

            for(i=1;i<=m;i++)

                scanf("%d",&row[i]);

            for(i=1;i<=n;i++)

            {

                for(j=1;j<=m;j++)

                {

                   if(tu[i][j]==1)

                   {

                       add(i,j+100);

                       add(j+100,i);

                   }

                }

            }

            bfs();

            printf("Case #%d: %d\n",o,tot);

        }

    }

}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: