Codeforces Round #420 (Div. 2) D. Okabe and City (最短路)

终于下定决心要写博客了,希望自己能坚持下去。


题意:n*m的方格里有k个方格是亮着的。主角要从(1,1)走到(n,m),只能走亮的格子。每次主角可以用一个硬币点亮一行或者一列的格子,但点亮下一行或下一列的时候,上次点亮的效果会消失。而且,改变点亮的行和列的时候,必须站在原来就亮着的格子。求最少支付的硬币数,无解输出-1。

做法很简单,除正常的建图之外,把每一行和一列都看成一个点,相邻的亮着的格子到这个点建两条有向边,格子到行列权是1,行列到格子权是0。跑一遍最短路即可。

现场SB了。。赛后再写很快就1A。

#include <bits/stdc++.h>
using namespace std;
#define endl '\n'
#define INF 0x3f3f3f3fLL
typedef pair< int, int > pii;
typedef long long ll;
int encode(int x, int y){ return x * 100000 + y; }
void decode(int a, int& x, int& y) { x = a / 100000; y = a % 100000; }
set<int>s;
map<int, int>mp;
int now = 0;
vector<int>v[100005];
vector<int>c[100005];
const int stepx[4] = {1,0,-1,0};
const int stepy[4] = {0,1,0,-1};
int n, m, k;
int dis[100005];
bool vis[100005];
queue<int>q;
bool check(int x, int y){
    if (x >= 1 && x <= n && y >= 1 && y <= m) return 1;
    else return 0;
}
int main(){
    ios::sync_with_stdio(0);
    cin >> n >> m >> k;
    int S = -1, T = -1;
    for (int i = 0; i < k; i++){
        int x, y; cin >> x >> y;
        s.insert(encode(x, y));
        if (x == 1 && y == 1) S = now;
        if (x == n && y == m) T = now;
        mp[encode(x, y)] = now++;
    }
    int rowstart = now - 1;
    int colstart = now + n - 1;
    for (set<int>::iterator it = s.begin(); it != s.end(); it++){
        int x, y; decode(*it, x, y);
        for (int i = 0; i < 4; i++){
            int newx = x + stepx[i];
            int newy = y + stepy[i];
            if (check(newx, newy) && s.find(encode(newx, newy)) != s.end()){
                v[mp[encode(newx, newy)]].push_back(mp[*it]);
                c[mp[encode(newx, newy)]].push_back(0);
                v[mp[*it]].push_back(mp[encode(newx, newy)]);
                c[mp[*it]].push_back(0);
            }
        }
        for (int i = max(1, x - 1); i <= min(n, x + 1); i++){
            v[rowstart + i].push_back(mp[*it]);
            c[rowstart + i].push_back(0);
            v[mp[*it]].push_back(rowstart + i);
            c[mp[*it]].push_back(1);
        }
        for (int i = max(1, y - 1); i <= min(m, y + 1); i++){
            v[colstart + i].push_back(mp[*it]);
            c[colstart + i].push_back(0);
            v[mp[*it]].push_back(colstart + i);
            c[mp[*it]].push_back(1);
        }
    }
    for (int i = 0; i < 100005; i++) {vis[i] = 0; dis[i] = INF;}
    dis[S] = 0; q.push(S);
    while (!q.empty()){
        int now = q.front(); q.pop();
        vis[now] = 0;
        for (int i = 0; i < v[now].size(); i++){
            if (dis[v[now][i]] > dis[now] + c[now][i]){
                dis[v[now][i]] = dis[now] + c[now][i];
                if (!vis[v[now][i]]){
                    q.push(v[now][i]); vis[v[now][i]] = 1;
                }
            }
        }
    }
    int ans = INF;
    if (T != -1) ans = dis[T];
    else ans = min(dis[rowstart + n], dis[colstart + m]);
    if (ans == INF) ans = -1;
    cout << ans << endl;
    return 0;
}


# 高校智慧校园解决方案摘要 智慧校园解决方案是针对高校信息化建设的核心工程,旨在通过物联网技术实现数字化校园的智能化升级。该方案通过融合计算机技术、网络通信技术、数据库技术和IC卡识别技术,初步实现了校园一卡通系统,进而通过人脸识别技术实现了更精准的校园安全管理、生活管理、教务管理和资源管理。 方案包括多个管理系统:智慧校园管理平台、一卡通卡务管理系统、一卡通人脸库管理平台、智能人脸识别消费管理系统、疫情防控管理系统、人脸识别无感识别管理系统、会议签到管理系统、人脸识别通道管理系统和图书馆对接管理系统。这些系统共同构成了智慧校园的信息化基础,通过统一数据库和操作平台,实现了数据共享和信息一致性。 智能人脸识别消费管理系统通过人脸识别终端,在无需接触的情况下快速完成消费支付过程,提升了校园服务效率。疫情防控管理系统利用热成像测温技术、视频智能分析等手段,实现了对校园人员体温监测和疫情信息实时上报,提高了校园公共卫生事件的预防和控制能力。 会议签到管理系统和人脸识别通道管理系统均基于人脸识别技术,实现了会议的快速签到和图书馆等场所的高效通行管理。与图书馆对接管理系统实现了一卡通系统与图书馆管理系统的无缝集成,提升了图书借阅的便捷性。 总体而言,该智慧校园解决方案通过集成的信息化管理系统,提升了校园管理的智能化水平,优化了校园生活体验,增强了校园安全,并提高了教学和科研的效率。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值