题目

传送门

题解

第一次一遍就AC一道bzoj上的题,虽然是一道水题。。。

我们做一边最短路,求出每个点的dist,然后再做一次类似spfa的操作,求出每个点是否可以用于建图。

在新图上拆点跑一边dinic就好辣。

代码

#include <algorithm>
#include <cstdio>
#include <cstring>
#include <queue>
#include <vector>
using namespace std;
#define ll long long
const ll inf = 100000000000;
const int maxn = 1000;
struct edge {
int from;
int to;
ll value;
};
vector<edge> edges;
vector<int> G[maxn];
vector<edge> gg[maxn];
void add(int from, int to, ll value) {
gg[from].push_back((edge){from, to, value});
}
void add_edge(int from, int to, ll value) {
edges.push_back((edge){from, to, value});
edges.push_back((edge){to, from, 0});
int m = edges.size();
G[from].push_back(m - 2);
G[to].push_back(m - 1);
}
ll dist[maxn];
int iter[maxn];
int n, m;
ll c[maxn];
int st, t;
void spfa(int s) {
for (int i = 1; i <= n; i++)
dist[i] = inf;
queue<int> q;
bool inq[maxn];
memset(inq, 0, sizeof(inq));
q.push(s);
dist[s] = 0;
inq[s] = 1;
while (!q.empty()) {
int u = q.front();
q.pop();
inq[u] = 0;
for (int i = 0; i < gg[u].size(); i++) {
edge &e = gg[u][i];
if (dist[e.to] > dist[u] + e.value) {
dist[e.to] = dist[u] + e.value;
if (!inq[e.to]) {
q.push(e.to);
inq[e.to] = 1;
}
}
}
}
}
void build_graph(int s, int e) {
queue<int> q;
q.push(s);
bool inq[maxn];
memset(inq, 0, sizeof(inq));
inq[s] = 1;
int vis[maxn];
memset(vis, 0, sizeof(vis));
vis[s] = 1;
add_edge(st, s, inf);
add_edge(e + n, t, inf);
add_edge(s, s + n, inf);
add_edge(e, e + n, inf);
while (!q.empty()) {
int u = q.front();
q.pop();
inq[u] = 0;
for (int i = 0; i < gg[u].size(); i++) {
edge &ee = gg[u][i];
if (dist[ee.to] == dist[u] + ee.value) { add_edge(u + n, ee.to, inf);
if (!vis[ee.to] && ee.to != e) {
add_edge(ee.to, ee.to + n, c[ee.to]);
vis[ee.to] = 1;
}
if (!inq[ee.to]) {
q.push(ee.to);
inq[ee.to] = 1;
}
}
}
}
}
void bfs(int s) {
memset(dist, -1, sizeof(dist));
dist[s] = 0;
queue<int> q;
q.push(s);
while (!q.empty()) {
int u = q.front();
q.pop();
for (int i = 0; i < G[u].size(); i++) {
edge &e = edges[G[u][i]];
if (e.value > 0 && dist[e.to] == -1) {
dist[e.to] = dist[u] + 1;
q.push(e.to);
}
}
}
}
ll dfs(int s, int t, ll flow) {
if (s == t)
return flow;
for (int &i = iter[s]; i < G[s].size(); i++) {
edge &e = edges[G[s][i]];
if (dist[e.to] > dist[s] && e.value > 0) {
int d = dfs(e.to, t, min(flow, e.value));
if (d > 0) {
e.value -= d;
edges[G[s][i] ^ 1].value += d;
return d;
}
}
}
return 0;
}
ll dinic(int s, int t) {
ll flow = 0;
while (1) {
bfs(s);
if (dist[t] == -1)
return flow;
memset(iter, 0, sizeof(iter));
ll d;
while (d = dfs(s, t, inf))
flow += d;
}
}
int main() {
// freopen("input", "r", stdin);
scanf("%d %d", &n, &m);
for (int i = 1; i <= m; i++) {
int x, y;
ll z;
scanf("%d %d %lld", &x, &y, &z);
add(x, y, z);
add(y, x, z);
}
for (int i = 1; i <= n; i++)
scanf("%lld", &c[i]);
spfa(1);
st = 0, t = n + n + 1;
build_graph(1, n); ll ans = dinic(st, t);
printf("%lld\n", ans);
}

Excited!

[bzoj3931][CQOI2015]网络吞吐量——最短路+网络流的更多相关文章

  1. bzoj 3931: [CQOI2015]网络吞吐量 -- 最短路+网络流

    3931: [CQOI2015]网络吞吐量 Time Limit: 10 Sec  Memory Limit: 512 MB Description 路由是指通过计算机网络把信息从源地址传输到目的地址 ...

  2. bzoj3931: [CQOI2015]网络吞吐量(spfa+网络流)

    3931: [CQOI2015]网络吞吐量 题目:传送门 题解: 现在有点难受....跳了一个多钟...菜啊... 题意都把做法一起给了....最短路+网路流啊. 不想说话...记得开long lon ...

  3. 【BZOJ-3931】网络吞吐量 最短路 + 最大流

    3931: [CQOI2015]网络吞吐量 Time Limit: 10 Sec  Memory Limit: 512 MBSubmit: 1228  Solved: 524[Submit][Stat ...

  4. bzoj3931: [CQOI2015]网络吞吐量

    将最短路图找出来,跑maxflow即可.有注意到数据范围.然后输出的时候%dWA了三次QAQ... #include<cstdio> #include<cstring> #in ...

  5. BZOJ 3931: [CQOI2015]网络吞吐量( 最短路 + 最大流 )

    最短路 + 最大流 , 没什么好说的... 因为long long WA 了两次.... ------------------------------------------------------- ...

  6. bzoj千题计划136:bzoj3931: [CQOI2015]网络吞吐量

    http://www.lydsy.com/JudgeOnline/problem.php?id=3931 在最短路网络上跑最大流 #include<queue> #include<c ...

  7. 【bzoj3931】[CQOI2015]网络吞吐量 最短路+最大流

    题目描述 路由是指通过计算机网络把信息从源地址传输到目的地址的活动,也是计算机网络设计中的重点和难点.网络中实现路由转发的硬件设备称为路由器.为了使数据包最快的到达目的地,路由器需要选择最优的路径转发 ...

  8. 【最短路】【最大流】bzoj3931 [CQOI2015]网络吞吐量

    跑出最短路图,然后把结点拆点跑最大流. #include<cstdio> #include<queue> #include<cstring> #include< ...

  9. BZOJ3931 [CQOI2015]网络吞吐量(最大流)

    没啥好说的,有写过类似的,就是预处理出最短路上的边建容量网络. #include<cstdio> #include<cstring> #include<queue> ...

随机推荐

  1. 问题:调用 ASP.Net Core WebAPI的HTTP POST方法时,从 [FromBody] 中读取的 MongoDB GeoJsonObjectModel成员总是null

    问题描述: POST/PUT to ASP.Net Core with [FromBody] to a MongoDB GeoJsonObjectModel member is always null ...

  2. 免费天气预报API接口

    一.中国气象局(http://www.weather.com.cn) 1.实时接口 http://mobile.weather.com.cn/data/sk/101010100.html http:/ ...

  3. nmon Analyser分析仪

    nmon Analyser官网: https://www.ibm.com/developerworks/community/wikis/home?lang=en#!/wiki/Power+System ...

  4. Python之tornado框架实现翻页功能

    1.结果如图所示,这里将html页面与网站的请求处理放在不同地方了 start.py代码 import tornado.ioloop import tornado.web from controlle ...

  5. Java项目启动时候报Neither the JAVA_HOME nor the JRE_HOME environment variable is defined 解决办法

    今天在发布Java项目的时候又遇到    Neither the JAVA_HOME nor the JRE_HOME environment variable is defined  At leas ...

  6. [译]如何比较同一分支上的不同commit的代码区别?

    原文来源:https://stackoverflow.com/questions/3338126/how-do-i-diff-the-same-file-between-two-different-c ...

  7. jquery $.getJSON 注意细节

    服务端: var json = "{\"title\": \"Recent Uploads tagged mountrainier\",\" ...

  8. 深入研究java.lang.Runtime类(转)

    一.概述      Runtime类封装了运行时的环境.每个 Java 应用程序都有一个 Runtime 类实例,使应用程序能够与其运行的环境相连接.      一般不能实例化一个Runtime对象, ...

  9. BZOJ4484 JSOI2015最小表示(拓扑排序+bitset)

    考虑在每个点的出边中删除哪些.如果其出边所指向的点中存在某点能到达另一点,那么显然指向被到达点的边是没有用的.于是拓扑排序逆序处理,按拓扑序枚举出边,bitset维护可达点集合即可. #include ...

  10. [洛谷P1278]单词游戏

    题目大意:给一个有$n(n\leqslant16)$个单词的字典,求单词接龙的最大长度 题解:发现$n$很小,可以状压,令$f_{i,j}$表示选的数的状态为$i$,最后一个字母是$j$的最大长度. ...