信息院赛-小红灌溉 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);
}
}
}
相关文章推荐
- Perl 正则表达式
- java Collection接口和Collections类的层次关系图,类图
- 第十二周上机项目3 时间类
- 设计模式--动态代理(CGLIB)
- 钟表维修管理系统技术解析(二) 登陆验证
- Hive表
- 南阳14 会场安排问题
- MessageBox 用法合集
- 多线程
- 【javascript】表单
- js的匿名函数及jQuery的图片轮播
- 黑马程序员--面向对象知识点总结(二)
- 南阳112 指数运算
- 第五次作业
- Eclipse - 安装语言包
- 用户需求驱动式的开发方法
- Thread.Sleep vs. Task.Delay
- 分级基金-散户的最佳投资标的
- laravel 学习笔记——起点
- 会员卡管理系统技术解析(十四) 库存卡作废记录添加