LOJ #6006. 试题库 (简单最大流+输出可行路径)
来源:互联网 发布:linux怎么重命名文件 编辑:程序博客网 时间:2024/06/01 09:02
题目描述
输入格式
输出格式
样例
数据范围与提示
1、从S向每个Xi连接一条容量为该类别所需数量的有向边。
2、从每个Yi向T连接一条容量为1的有向边。
3、如果一个题i属于一个类别j,连接一条从Xj到Yi容量为1的有向边。
求网络最大流,如果最大流量等于所有类别所需之和,则存在解,否则无解。对于每个类别,从X集合对应点出发的所有满流边,指向的B集合中的顶点就是该类别的所选的题(一个可行解)。
先看是否满流, 满流说明可以, 然后输出当前流是0的解就好了~#include <iostream>#include <cstring>#include <algorithm>#include <cstdio>#include <queue>using namespace std;const int INF = 1e9;const int maxn = 105;const int maxv = 2e4;int head[maxv], cur[maxv], d[maxv], s, t, k, sum;int n, m;struct node{ int v, w, next;}edge[maxv+6*maxn];void addEdge(int u, int v, int w){ edge[k].v = v; edge[k].w = w; edge[k].next = head[u]; head[u] = k++; edge[k].v = u; edge[k].w = 0; edge[k].next = head[v]; head[v] = k++;}int bfs(){ memset(d, 0, sizeof(d)); d[s] = 1; queue<int> q; q.push(s); while(!q.empty()) { int u = q.front(); if(u == t) return 1; q.pop(); for(int i = head[u]; i != -1; i = edge[i].next) { int to = edge[i].v, w = edge[i].w; if(w && d[to] == 0) { d[to] = d[u] + 1; if(to == t) return 1; q.push(to); } } } return 0;}int dfs(int u, int maxflow){ if(u == t) return maxflow; int ret = 0; for(int i = cur[u]; i != -1; i = edge[i].next) { int to = edge[i].v, w = edge[i].w; if(w && d[to] == d[u]+1) { int f = dfs(to, min(maxflow-ret, w)); edge[i].w -= f; edge[i^1].w += f; ret += f; if(ret == maxflow) return ret; } } return ret;}int Dinic(){ int ans = 0; while(bfs() == 1) { memcpy(cur, head, sizeof(head)); ans += dfs(s, INF); } return ans;}int main(){ while(~scanf("%d%d", &m, &n)) { memset(head, -1, sizeof(head)); k = 0; s = 0; t = n+m+1; sum = 0; int x, y;// scanf("%d", &x); for(int i = 1; i <= m; i++) { scanf("%d", &x); addEdge(s, i, x); sum += x; } for(int i = 1; i <= n; i++) { scanf("%d", &x); while(x--) { scanf("%d", &y); addEdge(y, i+m, 1); } addEdge(i+m, t, 1); } if(sum != Dinic()) puts("No Solution!"); else { for(int i = 1; i <= m; i++) { printf("%d:", i); for(int j = head[i]; j != -1; j = edge[j].next) { if(!edge[j].w && !(j&1)) //输出可行解 printf(" %d", edge[j].v-m); } puts(""); } } } return 0;}
阅读全文
0 0
- LOJ #6006. 试题库 (简单最大流+输出可行路径)
- 试题库问题 最大流 输出方案
- 【loj】#6006. 「网络流 24 题」试题库(二分图匹配)
- LOJ #115. 无源汇有上下界可行流
- loj #115. 无源汇有上下界可行流
- LOJ#101最大流
- loj 1251(2-sat + 输出一组可行解)
- loj 1407(2-sat + 枚举 + 输出一组可行解 )
- loj 1155(最大流)
- 【最大流 && 输出路径】POJ
- LOJ模板题 无源汇有上下界可行流
- loj 1154(最大流+枚举汇点)
- loj 1156(二分+最大流)
- loj 1167(二分+最大流)
- LOJ #116. 有源汇有上下界最大流
- 【网络流24题】试题库(二分图+最大流)
- 732. [网络流24题] 试题库 费用流/最大最小值
- 2个经典 zoj2314 无源汇有上下界最大流 并输出可行流 ZOJ3229 有源汇上下界最大流
- Train Problem I 栈
- Mac Eclipse
- Ceres-Solver学习笔记(8)
- 2017多校第二场 HDU 6049 Sdjpx Is Happy 区间DP,复杂度优化
- <Paper Reading>Brain dynamics
- LOJ #6006. 试题库 (简单最大流+输出可行路径)
- Android工具类: 基于Zxing的二维码生成和展示
- 7confirm消息对话框
- zepto和jquery的区别
- 剑指Offer——数值的整数次方
- 当子级元素浮动时让父级元素高度自适应的三种方法(以及多个子集元素同时存在浮动和绝对定位时的问题的解决办法)
- xLua Hello World
- UVA
- 排序算法---选择排序(Selection Sort)