HDU 5772 String problem(一个诡异的建图)

135 篇文章 0 订阅
109 篇文章 0 订阅

题目地址
题意:给你一个长度为n的只有0~9字符的字符串,要你挑出一些字符来组成一个新的字符串,然后挑选每个字符的代价是
这里写图片描述
然后呢,能得到的价值是(substr是新串,id[i]是原串的位置)就是求和,规则看下图。
这里写图片描述
思路:这个我还是搞得不太清楚,看到别人发的博客中放了官方题解,我就看了下,然后慢慢理解,但是建图就十分经典了,就是要理解点的划分的问题,官方题解讲的很详细了,我就不多说了。
这里写图片描述

#include <iostream>
#include <cstring>
#include <string>
#include <queue>
#include <vector>
#include <map>
#include <set>
#include <stack>
#include <cmath>
#include <cstdio>
#include <algorithm>
#include <iomanip>
#define N 6100
#define M 100010  
#define LL __int64
#define inf 0x3f3f3f3f3f3f3f3f
#define lson l,mid,ans<<1
#define rson mid+1,r,ans<<1|1
#define getMid (l+r)>>1
#define movel ans<<1
#define mover ans<<1|1
using namespace std;
const LL mod = 1000000007;
int head[N], level[N], cur[N];
int n, m, cnt;
struct node {
    int to;
    LL cap;//剩余流量
    int next;
}edge[M];
struct Dinic {
    void init() {
        memset(head, -1, sizeof(head));
        cnt = 0;
    }
    void add(int u, int v, LL cap) {//有向图
        edge[cnt].to = v, edge[cnt].cap = cap, edge[cnt].next = head[u], head[u] = cnt++;
        edge[cnt].to = u, edge[cnt].cap = 0, edge[cnt].next = head[v], head[v] = cnt++;//反向边
    }
    bool bfs(int s, int t){
        memset(level, -1, sizeof(level));
        queue<int>Q;
        level[s] = 0;
        Q.push(s);
        while (!Q.empty()){
            int u = Q.front(); Q.pop();
            for (int i = head[u]; i + 1; i = edge[i].next){
                int v = edge[i].to;
                if (edge[i].cap>0 && level[v] == -1){
                    level[v] = level[u] + 1;
                    Q.push(v);
                }
            }
        }
        return level[t] != -1;
    }

    LL dfs(int u, int t, LL f){
        if (u == t) return f;
        for (int &i = cur[u]; i + 1; i = edge[i].next){
            int v = edge[i].to;
            if (edge[i].cap>0 && level[v] == level[u] + 1){
                LL d = dfs(v, t, min(f, edge[i].cap));
                if (d>0){
                    edge[i].cap -= d;
                    edge[i ^ 1].cap += d;
                    return d;
                }
            }
        }
        return 0;
    }

    LL dinic(int s, int t){
        LL flow = 0;
        while (bfs(s, t)){
            for (int i = 0; i<N; i++) cur[i] = head[i];
            LL f;
            while ((f = dfs(s, t, inf))>0)
                flow += f;
        }
        return flow;
    }
}dc;
int main() {    
    cin.sync_with_stdio(false);
    LL a, b, c;
    int numa[10], numb[10];
    int mapp[110][110];
    int s, t;
    LL sum;
    int ans;
    string str;
    int T, Case = 1;
    cin >> T;
    while (T--) {
        cin >> n;
        dc.init();
        sum = 0;
        s = 0;
        t = n*(n - 1) / 2 + n + 10 + 1;//每个由第i个点和第j个点组成的点+n个坐标+10个字符+1
        cin >> str;
        for (int i = 0; i < 10; i++) {
            cin >> numa[i] >> numb[i];
        }
        for (int i = 0; i < n; i++) {
            for (int j = 0; j < n; j++) {
                cin >> mapp[i][j];
                sum += mapp[i][j];
            }
        }
        ans = 1;
        for (int i = 0; i < n; i++) {
            for (int j = i + 1; j < n; j++) {
                dc.add(s, ans, mapp[i][j] + mapp[j][i]);//价值
                dc.add(ans, n*(n - 1) / 2 + i + 1, inf);//n*(n - 1) / 2 + i  第几个字符
                dc.add(ans, n*(n - 1) / 2 + j + 1, inf);
                ans++;
            }
        }
        for (int i = 1; i <= n; i++) {
            dc.add(n*(n - 1) / 2 + i, n*(n - 1) / 2 + n + str[i - 1] - '0' + 1, inf);
            dc.add(n*(n - 1) / 2 + i, t, numa[str[i - 1] - '0']);//花费
        }
        for (int i = 0; i < 10; i++) {
            dc.add(n*(n - 1) / 2 + n + i + 1, t, (numb[i] - numa[i]));
        }
        cout << "Case #" << Case++ << ": " << sum - dc.dinic(s, t) << endl;
    }
    return 0;
}
在使用Python来安装geopandas包时,由于geopandas依赖于几个其他的Python库(如GDAL, Fiona, Pyproj, Shapely等),因此安装过程可能需要一些额外的步骤。以下是一个基本的安装指南,适用于大多数用户: 使用pip安装 确保Python和pip已安装: 首先,确保你的计算机上已安装了Python和pip。pip是Python的包管理工具,用于安装和管理Python包。 安装依赖库: 由于geopandas依赖于GDAL, Fiona, Pyproj, Shapely等库,你可能需要先安装这些库。通常,你可以通过pip直接安装这些库,但有时候可能需要从其他源下载预编译的二进制包(wheel文件),特别是GDAL和Fiona,因为它们可能包含一些系统级的依赖。 bash pip install GDAL Fiona Pyproj Shapely 注意:在某些系统上,直接使用pip安装GDAL和Fiona可能会遇到问题,因为它们需要编译一些C/C++代码。如果遇到问题,你可以考虑使用conda(一个Python包、依赖和环境管理器)来安装这些库,或者从Unofficial Windows Binaries for Python Extension Packages这样的网站下载预编译的wheel文件。 安装geopandas: 在安装了所有依赖库之后,你可以使用pip来安装geopandas。 bash pip install geopandas 使用conda安装 如果你正在使用conda作为你的Python包管理器,那么安装geopandas和它的依赖可能会更简单一些。 创建一个新的conda环境(可选,但推荐): bash conda create -n geoenv python=3.x anaconda conda activate geoenv 其中3.x是你希望使用的Python版本。 安装geopandas: 使用conda-forge频道来安装geopandas,因为它提供了许多地理空间相关的包。 bash conda install -c conda-forge geopandas 这条命令会自动安装geopandas及其所有依赖。 注意事项 如果你在安装过程中遇到任何问题,比如编译错误或依赖问题,请检查你的Python版本和pip/conda的版本是否是最新的,或者尝试在不同的环境中安装。 某些库(如GDAL)可能需要额外的系统级依赖,如地理空间库(如PROJ和GEOS)。这些依赖可能需要单独安装,具体取决于你的操作系统。 如果你在Windows上遇到问题,并且pip安装失败,尝试从Unofficial Windows Binaries for Python Extension Packages网站下载相应的wheel文件,并使用pip进行安装。 脚本示例 虽然你的问题主要是关于如何安装geopandas,但如果你想要一个Python脚本来重命名文件夹下的文件,在原始名字前面加上字符串"geopandas",以下是一个简单的示例: python import os # 指定文件夹路径 folder_path = 'path/to/your/folder' # 遍历文件夹中的文件 for filename in os.listdir(folder_path): # 构造原始文件路径 old_file_path = os.path.join(folder_path, filename) # 构造新文件名 new_filename = 'geopandas_' + filename # 构造新文件路径 new_file_path = os.path.join(folder_path, new_filename) # 重命名文件 os.rename(old_file_path, new_file_path) print(f'Renamed "{filename}" to "{new_filename}"') 请确保将'path/to/your/folder'替换为你想要重命名文件的实际文件夹路径。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值