tjut 5294
来源:互联网 发布:淘宝产品模板 编辑:程序博客网 时间:2024/04/30 07:39
#include <iostream> #include <cstdio> #include <cstring> #include <queue> #include <vector> using namespace std; const int INF = 0x7f7f7f; const int MAXM = 12e4+5; const int MAXN = 2e3+5; int n, m; struct Edge { int to, w, next; }edge[MAXM]; int tot, head[MAXN]; void addedge(int u, int v, int w) { edge[tot].to = v; edge[tot].w = w; edge[tot].next = head[u]; head[u] = tot++; edge[tot].to = u; edge[tot].w = w; edge[tot].next = head[v]; head[v] = tot++; } int dis[MAXN], vis[MAXN]; int minb[MAXN]; int spfa(int s) { memset(dis, 0x3f, sizeof(dis)); memset(vis, 0, sizeof(vis)); memset(minb, 0x3f, sizeof(minb)); queue<int> q; dis[s] = 0; minb[s] = 0; vis[s] = 1; q.push(s); while(!q.empty()) { int u = q.front(); q.pop(); vis[u] = 0; for(int i = head[u]; ~i; i = edge[i].next) { int v = edge[i].to, w = edge[i].w; if(dis[v] == dis[u] + w) { minb[v] = min(minb[v], minb[u] + 1); if(!vis[v]) { vis[v] = 1; q.push(v); } } if(dis[v] > dis[u] + w) { dis[v] = dis[u] + w; minb[v] = minb[u] + 1; if(!vis[v]) { vis[v] = 1; q.push(v); } } } } } struct Eg { int u, cap, rev; Eg(int uu, int cc, int rr) { u = uu; cap = cc; rev = rr; } }; vector<Eg> G[MAXN]; bool used[MAXN]; void add(int u, int v, int cap) { G[u].push_back(Eg(v, cap, G[v].size())); G[v].push_back(Eg(u, 0, G[u].size()-1)); } void build() { for(int i = 1; i <= n; ++i) { for(int j = head[i]; ~j; j = edge[j].next) { int v = edge[j].to, w = edge[j].w; if(dis[v] - dis[i] == w) { add(i, v, 1); } } } } int dfs(int v, int t, int f) { if(v == t) return f; used[v] = true; for(int i = 0; i < G[v].size(); ++i) { Eg &e = G[v][i]; if(!used[e.u] && e.cap > 0) { int d = dfs(e.u, t, min(f, e.cap)); if(d > 0) { e.cap -= d; G[e.u][e.rev].cap += d; return d; } } } return 0; } int max_flow(int s, int t) { int flow = 0; while(1) { memset(used, 0, sizeof(used)); int f = dfs(s, t, INF); if(f == 0) return flow; flow += f; } } void init() { tot = 0; memset(head, -1, sizeof(head)); for(int i = 0; i <= n; ++i) { G[i].clear(); } } int main() { //freopen("in", "r", stdin); while(~scanf("%d %d", &n, &m)) { init(); for(int i = 0; i < m; ++i) { int u, v, w; scanf("%d %d %d", &u, &v, &w); addedge(u, v, w); } spfa(1); build(); int ans = max_flow(1, n); printf("%d %d\n", ans, m-minb[n]); } return 0; }
0 0
- tjut 5294
- tjut 5289
- tjut 5288
- tjut 2586
- tjut 5296
- tjut 5297
- tjut 5299
- tjut 5384
- tjut 5387
- tjut 5386
- tjut 5381
- tjut 5400
- tjut 5399
- tjut 5396
- tjut 5398
- tjut 5412
- tjut 5410
- tjut 5416
- 【leetcode】141/142Linked List Cycle(Floyd判圈算法)
- 第四周 求四个数的最大公约数
- c++实验7-最大公约数和最小公倍数
- 通过atos命令获取64位错误地址的调用栈
- meta属性详解
- tjut 5294
- ijkplayer ffmpeg android独立编译
- 信号量解决读写者问题
- Ibatis中#与$的区别?
- C++第七次作业
- 为什么Maven会更改Eclipse JDK设置
- 十五周项目2 洗牌
- 第11期 《技术之路,越走越远》 2016年6月刊
- C++作业7