题目链接:

http://acm.hdu.edu.cn/showproblem.php?pid=5294

题意:

给你个无向图:

1、求最少删除几条边就能破坏节点1到节点n的最短路径,

2、最多能删除多少条边同时保证1到n的最短距离不变。

题解:

首先用spfa或dijcstra跑出所有最短路组成的DAG图。

用这个图跑最大流节能解决第一个问题,用这个图跑一遍bfs最短路就能解决第二个问题。

然而我在跑最大流的时候竟然把DAG图建成双向的了orz。。

代码:

#include<iostream>
#include<cstdio>
#include<vector>
#include<utility>
#include<queue>
#include<cstring>
using namespace std; const int maxn = ;
const int INF = 0x3f3f3f3f; struct Edge {
int u, v, c, f;
Edge(int u, int v, int c, int f) :u(u), v(v), c(c), f(f) {}
Edge() {}
}; struct Dinic {
int n, m, s, t;
vector<Edge> egs;
vector<int> G[maxn];
bool vis[maxn];
int d[maxn];
int cur[maxn]; void init(int n) {
this->n = n;
for (int i = ; i < n; i++) G[i].clear();
egs.clear();
} void addEdge(int u, int v, int c) {
egs.push_back(Edge(u, v, c, ));
egs.push_back(Edge(v, u, , ));
m = egs.size();
G[u].push_back(m - );
G[v].push_back(m - );
}
bool bfs() {
memset(vis, , sizeof(vis));
queue<int> Q;
Q.push(s);
d[s] = ;
vis[s] = ;
while (!Q.empty()) {
int x = Q.front(); Q.pop();
for (int i = ; i < G[x].size(); i++) {
Edge& e = egs[G[x][i]];
if (!vis[e.v] && e.c>e.f) {
vis[e.v] = ;
d[e.v] = d[x] + ;
Q.push(e.v);
}
}
}
return vis[t];
}
int dfs(int x, int a) {
if (x == t || a == ) return a;
int flow = , f;
for (int& i = cur[x]; i < G[x].size(); i++) {
Edge& e = egs[G[x][i]];
if (d[x] + == d[e.v] && (f = dfs(e.v, min(a, e.c - e.f)))>) {
e.f += f;
egs[G[x][i] ^ ].f -= f;
flow += f;
a -= f;
if (a == ) break;
}
}
return flow;
}
int Maxflow(int s, int t) {
this->s = s; this->t = t;
int flow = ;
while (bfs()) {
memset(cur, , sizeof(cur));
flow += dfs(s, INF);
}
return flow;
}
}dinic; int n, m; vector<pair<int, int> > G[maxn];
vector<pair<int,int> > pre[maxn]; int inq[maxn], d[maxn];
void spfa() {
queue<int> Q;
memset(inq, , sizeof(inq));
memset(d, 0x3f, sizeof(d));
d[] = ; inq[] = ; Q.push();
while (!Q.empty()) {
int u = Q.front(); Q.pop();
inq[u] = ;
for (int i = ; i < G[u].size(); i++) {
int v = G[u][i].first, w = G[u][i].second;
if (d[v] > d[u] + w) {
d[v] = d[u] + w;
pre[v].clear(); pre[v].push_back(make_pair(u,w));
if (!inq[v]) {
Q.push(v); inq[v] = ;
}
}
else if (d[v] == d[u] + w) {
pre[v].push_back(make_pair(u,w));
}
}
}
} int dp[maxn];
int bfs() {
memset(dp, -, sizeof(dp));
queue<int> Q;
Q.push(n - ); dp[n - ] = ;
while (!Q.empty()) {
int u = Q.front(); Q.pop();
for (int i = ; i < pre[u].size(); i++) {
int v = pre[u][i].first;
if (dp[v] == -) {
dp[v] = dp[u] + ;
Q.push(v);
}
}
}
return dp[];
} void init() {
dinic.init(n);
for (int i = ; i < n; i++) G[i].clear(),pre[i].clear();
} int main() {
while (scanf("%d%d", &n, &m) == && n) {
init();
for (int i = ; i < m; i++) {
int u, v, w;
scanf("%d%d%d", &u, &v, &w); u--, v--;
G[u].push_back(make_pair(v, w));
G[v].push_back(make_pair(u, w));
}
spfa();
for (int i = n - ; i > ; i--) {
for (int j = ; j < pre[i].size(); j++) {
int v = pre[i][j].first;
//最后建出来的图应该是DAG图!
//dinic.addEdge(i, v, 1);
dinic.addEdge(v, i, );
}
}
int ans1 = dinic.Maxflow(,n-);
int ans2 = m-bfs();
printf("%d %d\n", ans1,ans2);
}
return ;
} /*
8 9
1 2 2
2 3 2
2 4 1
3 5 3
4 5 4
5 8 1
1 6 2
6 7 5
7 8 2 3 3
1 2 1
1 3 1
2 3 1 3 4
1 2 1
2 3 0
1 3 2
1 3 3 */

HDU 5294 Tricks Device 最短路+最大流的更多相关文章

  1. hdu 5294 Tricks Device 最短路建图+最小割

    链接:http://acm.hdu.edu.cn/showproblem.php?pid=5294 Tricks Device Time Limit: 2000/1000 MS (Java/Other ...

  2. HDU 5294 Tricks Device (最大流+最短路)

    题目链接:HDU 5294 Tricks Device 题意:n个点,m条边.而且一个人从1走到n仅仅会走1到n的最短路径.问至少破坏几条边使原图的最短路不存在.最多破坏几条边使原图的最短路劲仍存在 ...

  3. HDU 5294 Tricks Device 网络流 最短路

    Tricks Device 题目连接: http://acm.hdu.edu.cn/showproblem.php?pid=5294 Description Innocent Wu follows D ...

  4. HDOJ 5294 Tricks Device 最短路(记录路径)+最小割

    最短路记录路径,同一时候求出最短的路径上最少要有多少条边, 然后用在最短路上的边又一次构图后求最小割. Tricks Device Time Limit: 2000/1000 MS (Java/Oth ...

  5. HDU 5294 Tricks Device(多校2015 最大流+最短路啊)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=5294 Problem Description Innocent Wu follows Dumb Zha ...

  6. hdu 5294 Tricks Device(2015多校第一场第7题)最大流+最短路

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=5294   题意:给你n个墓室,m条路径,一个人在1号墓室(起点),另一个人在n号墓室(终点),起点的那 ...

  7. HDU 5294 Tricks Device (最短路,最大流)

    题意:给一个无向图(连通的),张在第n个点,吴在第1个点,‘吴’只能通过最短路才能到达‘张’,两个问题:(1)张最少毁掉多少条边后,吴不可到达张(2)吴在张毁掉最多多少条边后仍能到达张. 思路:注意是 ...

  8. SPFA+Dinic HDOJ 5294 Tricks Device

    题目传送门 /* 题意:一无向图,问至少要割掉几条边破坏最短路,问最多能割掉几条边还能保持最短路 SPFA+Dinic:SPFA求最短路时,用cnt[i]记录到i最少要几条边,第二个答案是m - cn ...

  9. Tricks Device (hdu 5294 最短路+最大流)

    Tricks Device Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/65536 K (Java/Others) To ...

随机推荐

  1. js实现文字字幕滚动

    <div class="dggd_r" id="h" style="height:400px;overflow:hidden;display:i ...

  2. Mysql varchar大小长度问题介绍

    如果被 varchar 超过上述的 b 规则,被强转成 text 类型,则每个字段占用定义长度为 11 字节,当然这已经不是 varchar 了4.0版本以下,varchar(20),指的是20字节, ...

  3. ORMLiteDatabase的简单使用并且与其他的表相互联系

    1.下载jar 具体到Android,需要在 http://ormlite.com/releases 页面下载两个jar 包(本文基于ORMLite的版本是:ormlite 4.49-SNAPSHOT ...

  4. delphi 基础之四 delphi 组织结构

    delphi 组织结构 在Delphi中,一个正在开发的应用程序可以被称作项目或者工程.一般地,一个项目主要由dpr(项目).pas(单元)和dfm(窗体)三种文件组成,另外还有一些附属文件,如res ...

  5. How to using x++ code create GL journal[AX2012]

    static void FAN_GLImport(Args _args) { AxLedgerJournalTable header = new AxLedgerJournalTable(); AxL ...

  6. mysql 1093 错误

    1093错误: 要更新某表,同时该表有字段值又来自该表的查询语句. 例如: INSERT INTO m_bulletincategory ( OrganizationKey , CategoryNam ...

  7. 04-树6 Complete Binary Search Tree

    完全二叉树 刚开始只发现了中序遍历是从小到大顺序的.一直在找完全二叉树的层结点间规律...放弃了 不曾想,完全二叉树的规律早就知道啊.根结点为i,其左孩子结点2*i, 右孩子结点2*i+1. 结合此两 ...

  8. Redis客户端之Spring整合Jedis

      1.下载相关jar包,并引入工程: jedis-2.4.2.jar commons-pool2-2.0.jar 2.将以下XML配置引入spring <bean id="shard ...

  9. zip压缩

    package com.green.project.compress; import java.io.File;import java.io.FileInputStream;import java.i ...

  10. 一段高质量的SQL从问问题开始(笔记)

    首先SQL书写的目的是为了解决问题,因此只有明白了要解决的问题,才能写出更加高效的SQL语句,才能优雅的解决问题,获得更多的快乐! 在写一个SQL语句的时候不妨像优化器一样思考,问自己以下的这些问题, ...