2013 다 교 연합 2 I Warm up 2(hdu 4619)
3638 단어 HDU
Time Limit: 3000/1000 MS (Java/Others) Memory Limit: 65535/32768 K (Java/Others) Total Submission(s): 243 Accepted Submission(s): 108
Problem Description
Some 1×2 dominoes are placed on a plane. Each dominoe is placed either horizontally or vertically. It's guaranteed the dominoes in the same direction are not overlapped, but horizontal and vertical dominoes may overlap with each other. You task is to remove some dominoes, so that the remaining dominoes do not overlap with each other. Now, tell me the maximum number of dominoes left on the board.
Input
There are multiple input cases.
The first line of each case are 2 integers: n(1 <= n <= 1000), m(1 <= m <= 1000), indicating the number of horizontal and vertical dominoes.
Then n lines follow, each line contains 2 integers x (0 <= x <= 100) and y (0 <= y <= 100), indicating the position of a horizontal dominoe. The dominoe occupies the grids of (x, y) and (x + 1, y).
Then m lines follow, each line contains 2 integers x (0 <= x <= 100) and y (0 <= y <= 100), indicating the position of a horizontal dominoe. The dominoe occupies the grids of (x, y) and (x, y + 1).
Input ends with n = 0 and m = 0.
Output
For each test case, output the maximum number of remaining dominoes in a line.
사고방식:우 리 는 이 도미 노 골패 들 을 점 으로 볼 수 있다.만약 에 두 개의 도미 노 골패 가 겹 치면 그들 둘 사 이 를 한 변 으로 연결 시 킬 수 있다.그림 을 만 든 후에 우 리 는 이 그림 은 다음 과 같은 세 가지 상황 으로 구 성 될 수 있다 는 것 을 알 수 있다.하 나 는 단독 점,하 나 는 체인,하 나 는 링 이다.단독 점 에 대해 다른 골패 와 그것 이 겹 치지 않 는 다 는 것 을 설명 하고 답 은 1 을 더 하면 된다.한 개의 체인 에 대해우 리 는 이 사슬 이 반드시 수평 의 골패 와 수직 의 골패 가 순서대로 연결 되 어 형 성 된 것 을 발견 할 수 있다.이때 우 리 는 같은 방향의 골 패 를 모두 떼 어 내 서 겹 치지 않 은 골패(같은 방향의 골 패 는 겹 칠 수 없 기 때문이다)를 만 들 수 있다.이때 사슬 의 길 이 는 S 이 고 답 은(S+1)/2 를 더 하면 된다.고리 의 상황 은 체인 의 상황 과 같다.그리고 이분 도 최대 매 칭 도 가능 합 니 다.
다음은 참조 코드 입 니 다.
#include <iostream>
#include <string.h>
#include <algorithm>
#include <stdio.h>
#define maxn 110
using namespace std;
int map[maxn][maxn];
int vis[2010];
struct edge
{
int to;
int next;
}e[20010];
int box[2010],cnt;
void init()
{
cnt=0;
memset(box,-1,sizeof(box));
}
void add(int from,int to)
{
e[cnt].to=to;
e[cnt].next=box[from];
box[from]=cnt++;
}
int dfs(int now)
{
vis[now]=1;
int num=1;
for(int t=box[now];t+1;t=e[t].next)
{
int v=e[t].to;
if(!vis[v])
num+=dfs(v);
}
return num;
}
int main()
{
//freopen("dd.txt","r",stdin);
int n,m;
while(scanf("%d%d",&n,&m)&&(m+n))
{
int i,x,y;
init();
memset(map,0,sizeof(map));
for(i=1;i<=n;i++)
{
scanf("%d%d",&x,&y);
map[x][y]=map[x+1][y]=i;
}
for(i=1;i<=m;i++)
{
scanf("%d%d",&x,&y);
if(map[x][y])
{
add(map[x][y],i+n);
add(i+n,map[x][y]);
}
if(map[x][y+1])
{
add(map[x][y+1],i+n);
add(i+n,map[x][y+1]);
}
}
int ans=0;
memset(vis,0,sizeof(vis));
for(i=1;i<=n+m;i++)
{
if(!vis[i])
{
int tmp=dfs(i);
ans+=(tmp+1)/2;
}
}
printf("%d
",ans);
}
return 0;
}
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
[HDU] 4089 활성화 확률 DPdp[i][j]를 모두 i개인의 대기열인 Tomato가 j위 서버가 마비될 확률로 역추를 사용하면 우리는 상태 이동 방정식을 얻을 수 있다. i == 1 : dp[1][1] = dp[1][1] * p1 + dp[1]...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.