Crimewave UVA - 563(最大流)
传送门:QAQ
题意:就是给你一个二维平面图,然后图上有若干个整数点,问你是否可能每个点都到达边界并且图上任意一点只能被一个点经过且经过一次。
思路:因为每个点只能经过一次,所以我们将每个点拆成两个点,一个点是接受的,一个点是流出的,然后两个点之间的流量为1(注意边界点也要处理(这里错了好几次)),这样就能处理了。然后将源点与所有起点相连,然后就可以去跑最大流判断是否可以逃出。
附上代码:
#include <iostream>
#include <stdio.h>
#include <string.h>
#include <stack>
#include <queue>
#include <map>
#include <set>
#include <vector>
#include <math.h>
#include <bitset>
#include <algorithm>
#include <climits>
using namespace std;
const int inf=0x3f3f3f3f;typedef long long LL;
const int maxn = 6100;struct pon {int x;int y;
};
pon point[3000];
int n, m, k;
struct Edge {Edge() {}Edge(int from, int to, int cap, int flow) :from(from), to(to), cap(cap), flow(flow) {}int from, to, cap, flow;
};
struct Dinic {int n, m, s, t;vector<Edge>edges;vector<int>G[maxn];bool vis[maxn];int d[maxn];int cur[maxn];void init(int n) {this->n = n;for (int i = 0; i <= n; i++) G[i].clear();edges.clear();}void AddEdge(int from, int to, int cap) {edges.push_back(Edge(from, to, cap, 0));edges.push_back(Edge(to, from, 0, 0));m = edges.size();G[from].push_back(m - 2);G[to].push_back(m - 1);}bool BFS() {memset(vis, 0, sizeof(vis));queue<int>Q;Q.push(s);d[s] = 0;vis[s] = true;while (!Q.empty()) {int x = Q.front();Q.pop();for (int i = 0; i < G[x].size(); i++) {Edge& e = edges[G[x][i]];if (!vis[e.to] && e.cap > e.flow) {vis[e.to] = true;d[e.to] = d[x] + 1;Q.push(e.to);}}}return vis[t];}int DFS(int x, int a) {if (x == t || a == 0) return a;int flow = 0, f;for (int& i = cur[x]; i < G[x].size(); i++) {Edge& e = edges[G[x][i]];if (d[x] + 1 == d[e.to] && (f = DFS(e.to, min(a, e.cap - e.flow))) > 0) {e.flow += f;edges[G[x][i] ^ 1].flow -= f;flow += f;a -= f;if (a == 0) break;}}return flow;}int Maxflow(int s, int t) {this->s = s, this->t = t;int flow = 0;while (BFS()) {memset(cur, 0, sizeof(cur));flow += DFS(s, inf);}return flow;}
}DC;
int s, tt,t;
void build() {DC.init(6000);s = 0;for (int i = 0; i < k; i++) {DC.AddEdge(s, (point[i].y-1)*n + point[i].x,1);}tt = s + 2*n*m + 1;t = s + n*m + 1;for (int i = 1; i <= n; i++) {for (int z = 1; z <= m; z++) {DC.AddEdge((z - 1)*n + i, t, 1);if (z == 1 || z == m) {DC.AddEdge(t, tt, 1);}else if (i == 1 || i == n) {DC.AddEdge(t, tt, 1);}if (z - 1 >= 1) {DC.AddEdge(t, (z - 2)*n + i, 1);}if (z + 1 <= m) {DC.AddEdge(t, (z)*n + i, 1);}if (i - 1 >= 1) {DC.AddEdge(t, (z - 1)*n + i-1, 1);}if (i + 1 <= n) {DC.AddEdge(t, (z - 1)*n + i+1, 1);}t++;}}
}
int main(void) {int t;scanf("%d", &t);while (t--) {scanf("%d%d%d", &n, &m, &k);for (int i = 0; i < k; i++) {scanf("%d%d", &point[i].x, &point[i].y);}build();if (DC.Maxflow(s, tt) == k) printf("possible\n");else printf("not possible\n");}return 0;
}
Crimewave UVA - 563(最大流)相关推荐
- Matrix Decompressing UVA - 11082 最大流 + 输出方案
传送门 文章目录 题意: 思路: 题意: 给出前iii行的元素和A[i]A[i]A[i],前jjj列的元素B[j]B[j]B[j],让你构造一个矩阵使得其满足前iii行的元素和是A[i]A[i]A[i ...
- 初学者acm的练习题指南
上机练习题参考题 忘了在哪找的啦~~希望对大家有帮助呦 <!--[if !supportLists]-->1. <!--[endif]-->Programming Bas ...
- mac下查看mysql端口被占用_MAC下查看端口占用并杀死进程
Eclipse在Run on Server时,Tomcat是开启的,但是报错,显示8080.8005和8009端口被占用 终端输入 查看所有开启的端口 sudo lsof -i -P | grep - ...
- UVA - 10480 Sabotage(最小割-最大流+输出割边)
题目链接:点击查看 题目大意:给出一张无向图,1为起点,2为终点,删除每条边都需要权值wi,题目需要求将起点与终点分割为两个部分的最小花费,并且输出方案 题目分析:如果不让输出方案的话就是一个裸的最大 ...
- UVA - 820 Internet Bandwidth(最大流模板题)
题目: 思路: 直接套最大流的模板就OK了,注意一下输出的格式. 代码: #include <bits/stdc++.h> #define inf 0x3f3f3f3f #define M ...
- uva 10594(最小费用最大流)
题意:在一个无向网络中,告诉你边的容量与费用.现在需要传送d个数据问你你否能传送成功,若成功则最小费用是多少. 思路:显然是最小费用最大流问题,这道题的见图比较简单.只需要添加一个原点费用为D指向1就 ...
- UVa 10806 Dijkstra,Dijkstra(最小费用最大流)
裸的费用流.往返就相当于从起点走两条路到终点. 按题意建图,将距离设为费用,流量设为1.然后增加2个点,一个连向节点1,流量=2,费用=0;结点n连一条同样的弧,然后求解最小费用最大流.当且仅当最大流 ...
- UVA 10480 - Sabotage (最大流)
这道题的意思要把一个图分成两部分,要把点1和点2分开.隔断每条边都有一个花费,求最小花费的情况下,应该切断那些边. 这题很明显是最小割,也就是最大流.把1当成源点,2当成汇点. 问题是要求最小割应该隔 ...
- uva 753(网络流最大流)
网络流最大流问题,这里使s=0,使s与所有的插头相连,最大通量为1,然后插头和转换器相连,最大通量为1,转换器和转换器相连,因为有无限个,所以为inf,然后转换器和插座连,最大通量为1,插座和t相连, ...
最新文章
- Mysql中的DCL
- Java 8中Stream API的这些奇技淫巧!你都Get到了吗?
- NLP之TM:基于gensim库调用20newsgr学习doc-topic分布并保存为train-svm-lda.txt、test-svm-lda.txt
- https安全传输协议
- 【SQL】分组数据,过滤分组-group by , having
- 【Angular 4】 Cannot find module 'rxjs-compat'
- 03 Python爬虫之Requests网络爬取实战
- java 同步原语_你所不知道的有关Java 和Scala中的同步问题
- 漆桂林:多模态知识图谱种类及其应用
- SiteMesh框架统一布局用法介绍
- 强大好看的dz论坛社区源码手机端
- element-ui tabs组件导致页面假死浏览器崩溃
- 点歌系统源码 android,安卓盒子点歌系统代码
- Double Check形式的单例模式
- 杭电 2544 最短路(bellman详解)
- react-native连接夜神模拟器
- Aspose.Slides for .NET V23 Crack
- PR中直接打开AE去做特效方法?
- 使用 tcpcopy 线上导流及回放
- php 聊天室 教程,基于PHP的聊天室编程思想-PHP教程,PHP基础