题解 P3663 【[USACO17FEB]Why Did the Cow Cross the Road III S】

· · 题解

蒟蒻的第五篇题解

目录

1.思路

2.代码

一.思路

关于每个格子是否有道路相隔可以那一个三维数组记一下,这题跟P1457 城堡 The Castle比较像

之后再把牛的方位记一下

然后用dfs染色,最后统计每个连通块上的牛的个数,最后在把他们两两相乘的积相加得出答案

二.代码

#include<cstdio>
#include<iostream>
#include<algorithm>
#include<cstring>
#include<vector>
using namespace std;
int n,k;
int road;
int a[105][105][4];//北东西南 
int color[105][105];
int b[105][105];
int x,y,x1,y1;
int num;
int all;
long long ans;
vector<int> area;
int dx[4]={-1,0,1,0};
int dy[4]={0,1,0,-1};//北东西南 
void dfs(int x,int y)
{
    if(x<1||y<1||x>n||y>n){
        return;
    }
    if(color[x][y]!=-1){
        return;
    }
    color[x][y]=num;    
    if(b[x][y]==1){
        all++;
    }
    for(int i=0;i<4;i++){
        if(a[x][y][i]==1){
            continue;
        }
        int xx=x+dx[i];
        int yy=y+dy[i];
        dfs(xx,yy);
    }
}
int main()
{
    cin>>n>>k>>road;
    for(int i=1;i<=road;i++){
        cin>>x>>y>>x1>>y1;
        if(x==x1){
            a[x][min(y,y1)][1]=1;
            a[x][max(y,y1)][3]=1;
        }else{
            a[min(x,x1)][y][2]=1;
            a[max(x,x1)][y][0]=1;
        }
    }
    for(int i=1;i<=k;i++){
        cin>>x>>y;
        b[x][y]=1;
    }
    area.push_back(0);
    memset(color,-1,sizeof(color));
    for(int i=1;i<=n;i++){
        for(int i1=1;i1<=n;i1++){
            if(color[i][i1]==-1){
                all=0;
                num++;
                dfs(i,i1);
                area.push_back(all);
            }
        }
    }
    for(int i=1;i<num;i++){
        for(int i1=i+1;i1<=num;i1++){
            ans+=area[i]*area[i1];
        }
    }
    cout<<ans;
    return 0;
}

莫抄袭,没了AC记录,空悲切