D. Chemical table
题意:对于一个N*M的方框,一开始给你q个点,问是否能通过题中给出的操作填满这个方框,这个操作就是假设如果有L型的三个点已经在方框内,那么可以在对应的第四个点自动生成一个点,问最少要填几个数使得这个方框在任意次操作后能够被填满.
对于给定点的row或者是col内的所有点dfs下去打标记,最后没有被打过标记的点的个数-1就是ans(最初那个点不算,所以要-1).
题目不难,但是一开始自己又错题了(看成相邻三个的L型的才可以补一个)
(°ー°〃)
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
vector<int> c[400005];
//vector<int> r[200005];
int vis[400005];
void dfs(int x)
{
if(vis[x]) return;
vis[x]=1;
for(int i=0; i<c[x].size(); i++) dfs(c[x][i]);
}
int main()
{
int n,m,q;
scanf("%d%d%d",&n,&m,&q);
memset(vis,0,sizeof(vis));
while(q--)
{
int x,y;
scanf("%d%d",&x,&y);
c[x].push_back(y+n);
c[y+n].push_back(x);
}
int cnt=0;
for(int i=1;i<=n+m;i++) if(!vis[i]) dfs(i),cnt++;
printf("%d\n",cnt-1);
}