Антенна Размещение
Лимит времени: 1000 мс | Лимит памяти: 65536K | |
Всего Материалы: 6445 | Принято: 3182 |
Описание
Научно-исследовательский центр Global Aerial был выделена задачей построения пятого поколения телефонных сетей мобильной связи в Швеции. Наиболее яркая причина, почему они получили работу, их открытие нового, высоко шума устойчивости, антенны. Это называется 4DAir, и поставляется в четырех типов. Каждый тип может только передавать и принимать сигналы в направлении, выровненное с (слегка перекошенной) широтной и продольной сеткой, из-взаимодействующего электромагнитного поля Земли. Четыре типа соответствуют антенны, работающие в направлениях север, запад, юг и восток, соответственно. Ниже приведен пример картина достопримечательностей, изображенных на двенадцать маленьких колец и девять 4DAir антенн изображены эллипсами, покрывающих их.
Очевидно, что желательно использовать как несколько антенн, как это возможно, но по-прежнему обеспечивает покрытие для каждого места интереса. Мы моделировать эту проблему следующим образом: Пусть А прямоугольная матрица, описывающая поверхность Швеции, где вхождение А либо является точкой интереса, который должен быть покрыт, по меньшей мере, одной антенной, или пустым пространством. Антенны могут быть расположены только на входе в A. Когда антенна помещается в строке г и столбце С, эта запись считается покрыта, но и одним из соседних записей (с + 1, г), (с, г + 1 ), (с-1, г), или (с, г-1), покрыт в зависимости от типа выбранного для этой конкретной антенны. Какое наименьшее количество антенн для которых существует размещения в А такой, что все точки интереса покрыты?
Очевидно, что желательно использовать как несколько антенн, как это возможно, но по-прежнему обеспечивает покрытие для каждого места интереса. Мы моделировать эту проблему следующим образом: Пусть А прямоугольная матрица, описывающая поверхность Швеции, где вхождение А либо является точкой интереса, который должен быть покрыт, по меньшей мере, одной антенной, или пустым пространством. Антенны могут быть расположены только на входе в A. Когда антенна помещается в строке г и столбце С, эта запись считается покрыта, но и одним из соседних записей (с + 1, г), (с, г + 1 ), (с-1, г), или (с, г-1), покрыт в зависимости от типа выбранного для этой конкретной антенны. Какое наименьшее количество антенн для которых существует размещения в А такой, что все точки интереса покрыты?
вход
На первой строке ввода является единственным положительным целым числом N, указав количество сценариев, которые следуют. Каждый сценарий начинается с строкой, содержащей два целых числом положительной ч и ш, с 1 <= H <= 40 и 0 <W <= 10. После этого матрица представлена, описывающие точки интереса в Швеции в виде х линий, каждая из которых содержит W символов из множества [ «*», «о»]. А «*» - символ символизирует точку интереса, в то время как «блуждающий символ представляет открытое пространство.
Выход
Для каждого сценария, выведите минимальное количество антенн необходимо, чтобы охватить все «*» - записи в матрице к сценарию, по ряду своих собственных.
Пример ввода
2 7 9 ооо оооо ** ** ооо оо * или * да ** или ** ooooooooo ******* оо о * * о * оо оо ******* да 10 1 * * * или * * * * * *
Пример вывода
17 5
Нет покрытия для минимального пути двудольного графа Вершины = - половина максимального количества матчей / 2
#include<iostream>
#include<cstring>
using namespace std;
#define M 405
int a[M][M],b[M][M];
int p;
int v[M],f[M];
int w[4][2]={0,1,0,-1,1,0,-1,0};
int fi(int x)
{
for(int i=1;i<=p;i++)
if(!v[i] && b[x][i])
{
v[i]=1;
if(!f[i] || fi(f[i]))
{
f[i]=x;
return 1;
}
}
return 0;
}
int main()
{
int T;
cin>>T;getchar();
while(T--)
{
memset(a,0,sizeof(a));
memset(b,0,sizeof(b));
memset(f,0,sizeof(f));
int n,m;
cin>>n>>m;
int i,j;
char c;
p=0;
for(i=1;i<=n;i++)
{
for(j=1;j<=m;j++)
{
cin>>c;
if(c=='*')
a[i][j]=++p;
}
getchar();
}
for(i=1;i<=n;i++)
for(j=1;j<=m;j++)
if(a[i][j]) for(int q=0;q<4;q++)
{
int x=i+w[q][0];
int y=j+w[q][1];
if(a[x][y])
b[a[i][j]][a[x][y]]=1;
}
int sum=0;
for(i=1;i<=p;i++)
{
memset(v,0,sizeof(v));
if(fi(i)) sum++;
}
cout<<p-sum/2<<endl;
}
return 0;
}