网络瘤好题 洛谷 P5030 长脖子鹿放置

题目链接

其实这是一道匈牙利裸题。。。主要难点在于建二分图。

这是题目给的图。。。
1783639-20190914184547694-218265563.png
这是某位神犇给的图。。。
1783639-20190914184741548-1888234212.png
一目了然二分图怎么建。。。
话不多说,直接上代码。。。

#include<cstdio>
#include<vector>
#include<cstring>
#include<iostream>
using namespace std;
template<class T>
inline void read(T& p) {
    char c;
    p=0;
    bool f=0;
    for(c=getchar(); c<'0'||c>'9'; c=getchar())if(c=='-')f=true;
    for(; c>='0'&&c<='9'; c=getchar()) p=(p<<3)+(p<<1)+c-'0';
    if(f)p=-p;
}
template<class T,class... Args>
inline void read(T& x,Args&... args) {
    read(x);
    read(args...);
}
template<class T>
inline void write(T x) {
    if(x<0) putchar('-'),x=-x;
    if(x>9) write(x/10);
    putchar('0'+x%10);
}
template<class T,class... Args>
inline void write(T x,Args... args) {
    write(x);
    putchar(' ');
    write(args...);
}
template<class... Args>
inline void writeln(Args... args) {
    write(args...);
    putchar('\n');
}
int n,m,e,ans;
int u,v;
vector<int> dis[40001];
bool vis[40001];
bool zi[201][201];
int match[40001];
int fx[8]= {-3,-3,-1,-1,1,1,3,3};
int fy[8]= {-1,1,-3,3,-3,3,-1,1};
inline int num(int x,int y) {
    return (x-1)*n+y;
}
bool find(int x) {
    for(register int i=0,to; i<dis[x].size(); i++) {
        to=dis[x][i];
        if(!vis[to]) {
            vis[to]=true;
            if(!match[to]||find(match[to])) {
                match[to]=x;
                return true;
            }
        }
    }
    return false;
}
int max_match() {
    int ans=0;
    for(register int i=1; i<=n; i+=2) {
        for(register int j=1; j<=m; j++) {
            if(!zi[i][j]) {
                memset(vis,0,sizeof(vis));
                if(find(num(i,j)))ans++;
            }
        }
    }
    return ans;
}
int main() {
    read(n,m,e);
    for(register int i=1,x,y; i<=e; i++) {
        read(x,y);
        zi[x][y]=1;
    }
    for(register int i=1; i<=n; i+=2) {
        for(register int j=1; j<=m; j++) {
            if(zi[i][j])continue;
            for(register int k=0; k<8; k++) {
                int _x=i+fx[k],_y=j+fy[k];
                if(_x<1||_y<1||_x>n||_y>m||zi[_x][_y])continue;
                dis[num(i,j)].push_back(num(_x,_y));
            }
        }
    }
    write(n*m-e-max_match());
    return 0;
}

蜜汁80分,emm被卡常了。。。
不用STL,用链式前向星。。。

#include<cstdio>
#include<vector>
#include<cstring>
#include<iostream>
using namespace std;
template<class T>
inline void read(T& p) {
    char c;
    p=0;
    bool f=0;
    for(c=getchar(); c<'0'||c>'9'; c=getchar())if(c=='-')f=true;
    for(; c>='0'&&c<='9'; c=getchar()) p=(p<<3)+(p<<1)+c-'0';
    if(f)p=-p;
}
template<class T,class... Args>
inline void read(T& x,Args&... args) {
    read(x);
    read(args...);
}
template<class T>
inline void write(T x) {
    if(x<0) putchar('-'),x=-x;
    if(x>9) write(x/10);
    putchar('0'+x%10);
}
template<class T,class... Args>
inline void write(T x,Args... args) {
    write(x);
    putchar(' ');
    write(args...);
}
template<class... Args>
inline void writeln(Args... args) {
    write(args...);
    putchar('\n');
}
struct edge {
    int u,v,next;
} a[2000001];
int n,m,e,ans;
int u,v;
int tot,fr[40001];
bool vis[40001];
bool zi[201][201];
int match[40001];
int fx[8]= {-3,-3,-1,-1,1,1,3,3};
int fy[8]= {-1,1,-3,3,-3,3,-1,1};
inline int num(int x,int y) {
    return (x-1)*n+y;
}
inline void add(int from,int to) {
    a[++tot].u=from;
    a[tot].v=to;
    a[tot].next=fr[from];
    fr[from]=tot;
}
bool find(int x) {
    for(register int now=fr[x],to;now;now=a[now].next) {
        to=a[now].v;
        if(!vis[to]) {
            vis[to]=true;
            if(!match[to]||find(match[to])) {
                match[to]=x;
                return true;
            }
        }
    }
    return false;
}
int max_match() {
    int ans=0;
    for(register int i=1; i<=n; i+=2) {
        for(register int j=1; j<=m; j++) {
            if(!zi[i][j]) {
                memset(vis,0,sizeof(vis));
                if(find(num(i,j)))ans++;
            }
        }
    }
    return ans;
}
int main() {
    read(n,m,e);
    for(register int i=1,x,y; i<=e; i++) {
        read(x,y);
        zi[x][y]=1;
    }
    for(register int i=1; i<=n; i+=2) {
        for(register int j=1; j<=m; j++) {
            if(zi[i][j])continue;
            for(register int k=0; k<8; k++) {
                int _x=i+fx[k],_y=j+fy[k];
                if(_x<1||_y<1||_x>n||_y>m||zi[_x][_y])continue;
                add(num(i,j),num(_x,_y));
            }
        }
    }
    write(n*m-e-max_match());
    return 0;
}

好了AC了

转载于:https://www.cnblogs.com/STOGMH/p/11519849.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
智慧校园整体解决方案是响应国家教育信息化政策,结合教育改革和技术创新的产物。该方案以物联网、大数据、人工智能和移动互联技术为基础,旨在打造一个安全、高效、互动且环保的教育环境。方案强调从数字化校园向智慧校园的转变,通过自动数据采集、智能分析和按需服务,实现校园业务的智能化管理。 方案的总体设计原则包括应用至上、分层设计和互联互通,确保系统能够满足不同用户角色的需求,并实现数据和资源的整合与共享。框架设计涵盖了校园安全、管理、教学、环境等多个方面,构建了一个全面的校园应用生态系统。这包括智慧安全系统、校园身份识别、智能排课及选课系统、智慧学习系统、精品录播教室方案等,以支持个性化学习和教学评估。 建设内容突出了智慧安全和智慧管理的重要性。智慧安全管理通过分布式录播系统和紧急预案一键启动功能,增强校园安全预警和事件响应能力。智慧管理系统则利用物联网技术,实现人员和设备的智能管理,提高校园运营效率。 智慧教学部分,方案提供了智慧学习系统和精品录播教室方案,支持专业级学习硬件和智能化网络管理,促进个性化学习和教学资源的高效利用。同时,教学质量评估中心和资源应用平台的建设,旨在提升教学评估的科学性和教育资源的共享性。 智慧环境建设则侧重于基于物联网的设备管理,通过智慧教室管理系统实现教室环境的智能控制和能效管理,打造绿色、节能的校园环境。电子班牌和校园信息发布系统的建设,将作为智慧校园的核心和入口,提供教务、一卡通、图书馆等系统的集成信息。 总体而言,智慧校园整体解决方案通过集成先进技术,不仅提升了校园的信息化水平,而且优化了教学和管理流程,为学生、教师和家提供了更加便捷、个性化的教育体验。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值