hdu 1853 Cyclic Tour(最小费用最大流)
2015-07-14 16:36
393 查看
题目链接:
点击打开链接
题目链接:
给出一张图,许多有向边,将图分成几个环路进行周游,问最小花费是多少
题目分析:
因为环的性质导致图中的每个点的度数均为1,所以只需要为每个点选择一条花费最小的入边即可,切不能重复使用一条边,直接将每座城市拆点,然后源点连向每座城市的第一个点,容量为1,每个城市的第二个点连向汇点,容量为1,花费为0,然后每条边就是对应起点拆完的第一个点连向终点拆完的第二个点连接,容量为1,花费为路径长度,但是注意的是,这道题中会出现重边,所以如果采用邻接矩阵的话,要保留最小的边
代码如下:
点击打开链接
题目链接:
给出一张图,许多有向边,将图分成几个环路进行周游,问最小花费是多少
题目分析:
因为环的性质导致图中的每个点的度数均为1,所以只需要为每个点选择一条花费最小的入边即可,切不能重复使用一条边,直接将每座城市拆点,然后源点连向每座城市的第一个点,容量为1,每个城市的第二个点连向汇点,容量为1,花费为0,然后每条边就是对应起点拆完的第一个点连向终点拆完的第二个点连接,容量为1,花费为路径长度,但是注意的是,这道题中会出现重边,所以如果采用邻接矩阵的话,要保留最小的边
代码如下:
#include <iostream> #include <cstring> #include <algorithm> #include <cstdio> #include <queue> #define MAX 207 #define INF 0x7fffffff using namespace std; int flow[MAX][MAX]; int cost[MAX][MAX]; int pre[MAX],dis[MAX]; int minflow[MAX],mark[MAX]; int spfa ( int start , int end ) { queue<int> q; memset ( mark , 0 , sizeof ( mark )); memset ( pre , -1 , sizeof ( pre )); for ( int i = 0 ; i < MAX ; i++ ) dis[i] = minflow[i] = INF; q.push ( start ); dis[start] = 0; mark[start] = 1; while ( !q.empty()) { int u = q.front(); q.pop(); mark[u] = 0; for ( int i = 0 ; i <= end ; i++ ) if ( flow[u][i]&&dis[i] > dis[u] + cost[u][i] ) { dis[i] = dis[u] + cost[u][i]; pre[i] = u; minflow[i] = min ( minflow[u] , flow[u][i]); if ( !mark[i] ) { mark[i] = 1; q.push ( i ); } } } return dis[end] != INF; } int maxflow_mincost ( int start , int end ) { int i,x,ans = 0; int temp = 0; while ( spfa ( start , end ) ) { x = end; while ( pre[x] != -1 ) { flow[pre[x]][x] -= minflow[end]; flow[x][pre[x]] += minflow[end]; x = pre[x]; } ans += dis[end]; temp++; } if ( temp == (end-1)/2 ) return ans; else return -1; } int main ( ) { int a,b,c,n,m; while (~scanf ( "%d%d" , &n , &m )) { int s = 0 , e = 2*n+1; memset ( flow , 0 , sizeof ( flow )); memset ( cost , 0 , sizeof ( cost )); for ( int i = 1 ; i <= n ; i++ ) { flow[s][i] = 1; flow[i+n][e] = 1; } while ( m-- ) { scanf ( "%d%d%d" , &a , &b , &c ); flow[a][b+n] = 1; if ( !cost[a][b+n ] ) cost[a][b+n] = c; else cost[a][b+n] = min ( c , cost[a][b+n]); cost[b+n][a] = -cost[a][b+n]; } printf ( "%d\n" , maxflow_mincost ( s , e )); } }
相关文章推荐
- TCP/IP网络编程 学习笔记_6 --定义应用层协议
- 【小白的成长】activity跳转如何正确跳转
- 11-基于CPCI的中频功率放大收发板
- TCP/IP网络编程 学习笔记_6 --定义应用层协议
- 仅需一个参数就可搞定OneProxy的VIP机制
- 【Java基础学习笔记】Java中Socket+Swing设计简单通信
- iOS内存管理小总结
- Scala:类的属性、对象私有属性
- 微信sdk的使用出现invalid url domain
- 11gR2 Database Services for "Policy" and "Administrator" Managed Databases (文件 ID 1481647.1)
- CSS3 Border-image出自W3CPLUS
- HTML标签_Form
- Android精品资源汇总,10个源码(持续更新)
- 对逆变和协变的理解
- actionbar tab 字体大小设置
- Java创建以及读写xml文档(dom方式)
- Linux命令之查看系统信息
- Android TextView(EditView)文字底部或者中间 加横线
- 搜索引擎---solr 怎么玩
- JSON日期格式化