题意:
有n个盒子围成一个圆,每个盒子里有若干个球。
要求使得每个盒子里的球不超过1个,每一步可以将一个球移动到它相邻的盒子里。
问最少步数。
思路:
s向每个盒子连边,容量为球的个数,花费为0。
每个盒子向t连边,容量为1,花费为0。
每个盒子向它两边的盒子连边,容量无穷,花费为1。
计算费用流即可。
代码:
#include <cstdio>
#include <cstring>
#include <algorithm>
#include <iostream>
#include <vector>
#include <queue>
#define INF 0x3f3f3f3f
#define T (n + 1)
using namespace std;
struct Edge{
int from, to, cap, flow, cost;
Edge() {}
Edge(int a, int b, int c, int d, int e)
: from(a), to(b), cap(c), flow(d), cost(e) {}
};
int n;
vector<int> G[1005];
vector<Edge> edges;
int pre[1005];
int a[1005];
int dist[1005];
bool vis[1005];
void addEdge(int from, int to, int cap, int cost) {
edges.push_back(Edge(from, to, cap, 0, cost));
edges.push_back(