网络流三·二分图多重匹配 HihoCoder - 1393

本文介绍了一种使用网络流解决二分图多重匹配问题的方法,并提供了完整的C++代码实现。通过ISAP(In-Place Shortest Augmenting Path)算法求解最大流,以此判断是否满足题目要求的条件。

网络流三·二分图多重匹配

 HihoCoder - 1393 

 

  1 #include <bits/stdc++.h>
  2 using namespace std;
  3 const int maxv = 210;
  4 const int maxe = 10210;
  5 const int inf = 0x3f3f3f3f;
  6 struct Edge{
  7     int u, v, nex;
  8     int cap, flow;
  9     Edge(int u=0, int v=0, int nex=0, int cap=0, int flow=0):
 10         u(u), v(v), nex(nex), cap(cap), flow(flow){}
 11 }e[maxe<<1];
 12 int head[maxv];
 13 int cnt;
 14 void init(){
 15     memset(head, -1, sizeof(head));
 16     cnt = 0;
 17 }
 18 
 19 void add(int u, int v, int cap){
 20     e[cnt] = Edge(u, v, head[u], cap, 0);
 21     head[u] = cnt++;
 22     e[cnt] = Edge(v, u, head[v], 0, 0);
 23     head[v] = cnt++;
 24 }
 25 
 26 int d[maxv], num[maxv], cur[maxv], p[maxv];
 27 int vis[maxv];
 28 int S, T;
 29 int N;
 30 
 31 void bfs(){
 32     memset(d, -1, sizeof(d));
 33     memset(vis, 0, sizeof(vis));
 34     queue<int> q;
 35     q.push(T);
 36     vis[T] = 1;
 37     d[T] = 0;
 38     while(!q.empty()){
 39         int u = q.front();
 40         q.pop();
 41         for(int i = head[u]; ~i; i = e[i].nex){
 42             int id = i&(-2);  //正边
 43             int v = e[id].u;
 44             if(!vis[v] && e[id].cap > e[id].flow){
 45                 vis[v] = 1;
 46                 d[v] = d[u] + 1;
 47                 q.push(v);
 48             }
 49         }
 50     }
 51 }
 52 
 53 int augment(){
 54     int u = T;
 55     int a = inf;
 56     while(u!=S){
 57         int id = p[u];
 58         a = min(a, e[id].cap - e[id].flow);
 59         u = e[id].u;
 60     }
 61     u = T;
 62     while(u!=S){
 63         int id = p[u];
 64         e[id].flow += a;
 65         e[id^1].flow -= a;
 66         u = e[id].u;
 67     }
 68     return a;
 69 }
 70 
 71 int ISAP(){
 72     bfs();
 73     int flow = 0;
 74     memset(num, 0, sizeof(num));
 75     for(int i = 0; i < N; i++){
 76         cur [i] = head[i];
 77         if(~d[i]) num[d[i]]++;
 78     }
 79     int u = S;
 80     while(d[S] < N){
 81         if(u == T){
 82             flow += augment();
 83             u = S;
 84         }
 85         int ok = 0;
 86         for(int i = cur[u]; ~i; i = e[i].nex){
 87             int v = e[i].v;
 88             if(d[u] == d[v]+1 && e[i].cap > e[i].flow){
 89                 p[v] = i;
 90                 ok = 1;
 91                 cur[u] = i;
 92                 u = v;
 93                 break;
 94             }
 95         }
 96         if(!ok){
 97             int m = N-1;
 98             for(int i = head[u]; ~i; i = e[i].nex){
 99                 if(e[i].cap > e[i].flow && ~d[e[i].v]) m = min(m, d[e[i].v]);
100             }
101             if(--num[d[u]] == 0) break;
102             num[d[u]=m+1]++;
103             cur[u] = head[u];
104             if(u != S) u = e[p[u]].u;
105         }
106     }
107     return flow;
108 }
109 int main(){
110     int t;
111     scanf("%d", &t);
112     int n, m;
113     while(t--) {
114         init();
115         scanf("%d %d", &n, &m);
116         int res = 0;
117         int var;
118         S = 0;
119         T = n+m+1;
120         N = T+1;
121         for(int i = 1; i <= m; i++){
122             scanf("%d", &var);
123             add(n+i, T, var);
124             res += var;
125         }
126         int a, b, x;
127         for(int i = 1; i <= n; i++){
128             scanf("%d %d", &a, &b);
129             add(S, i, a);
130             for(int j = 0; j < b; j++){
131                 scanf("%d", &x);
132                 add(i, x+n, 1);
133             }
134         }
135         int ans = ISAP();
136         if(ans == res) puts("Yes");
137         else puts("No");
138     }
139     return 0;
140 }
View Code

 

转载于:https://www.cnblogs.com/yijiull/p/7631125.html

代码下载地址: https://pan.quark.cn/s/a4b39357ea24 在计算机视觉技术中,数据集扮演着训练和评估模型的核心角色。Labelme作为一个广受欢迎的开源工具,能够支持用户以交互方式对像进行标注,而COCO(Common Objects in Context)则是一种被广泛采纳的数据集标准格式,适用于包括物体检测、像分割在内的多种任务。本文将详细阐述如何将Labelme生成的标注数据转换为COCO数据集的标准格式。 Labelme标注的像在输出为JSON格式时,会包含以下核心内容: 1. `version`: 指明JSON文件的版本信息。 2. `flags`: 目前未定义或保持为空,预留用于未来的功能扩展。 3. `shapes`: 列表形式存储对象的形状信息,每个形状项包含`label`(对象类别名称),`points`(构成对象边缘的多边形顶点),以及`shape_type`(通常为“polygon”)。 4. `imagePath`和`imageData`: 提供原始像的存储路径和二进制数据,便于后续像的还原。 5. `imageHeight`和`imageWidth`: 明确标注像的垂直和水平尺寸。 COCO数据集的标准格式中定义了种主要的标注类型: 1. Object instances(目标实例):主要用于执行物体检测任务。 2. Object keypoints(目标上的关键点):适用于人体姿态估计相关应用。 3. Image captions(看说话):用于生成像的文本描述。 COCO的JSON结构中包含以下基本组成部分: 1. `images`:记录像的基本属性,包括`height`(高度)、`...
内容概要:本文围绕基于Basisformer模型的时间序列锂离子电池SOC(State of Charge,荷电状态)预测展开研究,利用PyTorch深度学习框架构建并训练模型,旨在提升锂电池SOC估计的准确性与鲁棒性。该方法融合Transformer架构的核心机制,通过引入基函数(Basis)分解策略,有效捕捉电池充放电过程中长时序、非线性动态特征,增强模型对复杂工况的适应能力。研究不仅详细阐述了Basisformer的网络结构设计、注意力机制优化与训练流程,还提供了完整的Python代码实现方案,涵盖数据预处理、模型搭建、损失函数定义、训练验证及结果可视化等环节,便于科研人员快速复现、调优并拓展至其他电池状态预测任务。; 适合人群:具备一定深度学习与Python编程基础,熟悉PyTorch框架,从事电池管理系统(BMS)、新能源汽车、储能系统、智能传感等领域的高校研究生、科研人员及工程技术人员。; 使用场景及目标:①应用于动力电池与储能系统的实时SOC估算模块,提升系统安全性与能量利用效率;②作为学术研究的基础模型,用于复现、改进基于Transformer的时间序列预测方法在电化学系统中的应用;③为数据驱动的电池健康状态(SOH)、剩余使用寿命(RUL)联合估计提供可扩展的技术框架。; 阅读建议:建议读者结合所提供的代码与公开电池数据集(如NASA、CALCE等)进行动手实践,深入理解模型的输入输出结构与时序建模逻辑,同时可尝试引入温度、老化周期等多维特征,或融合物理模型构建混合预测架构,以进一步提升预测精度与泛化能力。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值