UVA - 1349          

                                   Optimal Bus Route Design

Time Limit: 3000MS

Memory Limit: Unknown

64bit IO Format: %lld & %llu

Description

A big city wants to improve its bus transportation system. One of the improvement is to add scenic routes which go es through attractive places. Your task is to construct a bus-route-plan for sight-seeing buses in a city.

You are given a set of scenic lo cations. For each of these given lo cations, there should be only one bus route that passes this lo cation, and that bus route should pass this lo cation exactly once. The number of bus routes is unlimited. However, each route should contain at least two scenic lo cations.

From location i to location j , there may or may not be a connecting street. If there is a street from location i to location j , then we say j is an out-neighbor of i . The length of the street from i to j is d (i, j) . The streets might be one way. So it may happen that there is a street from i to j , but no street from j to i . In case there is a street from i to j and also a street from j to i , the lengths d (i, j) and d (j, i) might be different. The route of each bus must follow the connecting streets and must be a cycle. For example, the route of Bus A might be from location 1 to location 2, from location 2 to location 3, and then from location 3 to location 1. The route of Bus B might be from location 4 to location 5, then from location 5 to location 4. The length of a bus route is the sum of the lengths of the streets in this bus route. The total length of the bus-route-plan is the sum of the lengths of all the bus routes used in the plan. A bus-route-plan is optimal if it has the minimum total length. You are required to compute the total length of an optimal bus-route-plan.

Input 

The input file consists of a number of test cases. The first line of each test case is a positive integer n , which is the number of locations. These n locations are denoted by positive integers 1, 2,..., n . The next n lines are information about connecting streets between these lo cations. The i -th line of these n lines consists of an even number of positive integers and a 0 at the end. The first integer is a lo cation j which is an out-neighbor of location i , and the second integer is d (i, j) . The third integer is another location j' which is an out-neighbor of i , and the fourth integer is d (i, j') , and so on. In general, the (2k - 1) th integer is a location t which is an out-neighbor of location i , and the 2k th integer is d (i, t) .

The next case starts immediately after these n lines. A line consisting of a single ` 0' indicates the end of the input file.

Each test case has at most 99 locations. The length of each street is a positive integer less than 100.

Output 

The output contains one line for each test case. If the required bus-route-plan exists, then the output is a positive number, which is the total length of an optimal bus-route-plan. Otherwise, the output is a letter `N'.

Sample Input 

3

2 2 3 1 0

1 1 3 2 0

1 3 2 7 0

8

2 3 3 1 0

3 3 1 1 4 4 0

1 2 2 7 0

5 4 6 7 0

4 4 3 9 0

7 4 8 5 0

6 2 5 8 8 1 0

6 6 7 2 0

3

2 1 0

3 1 0

2 1 0

0

Sample Output 

7

25

N

【思路】

二分图最佳完美匹配。

“只要每个点有唯一的后继,每个点恰好属于一个圈”。拆点后问题转化为二分图的最佳完美匹配问题。

【代码】

 #include<cstdio>
#include<cstring>
#include<queue>
#include<vector>
#include<iostream>
#define FOR(a,b,c) for(int a=(b);a<(c);a++)
using namespace std; const int maxn = +;
const int INF = 1e9; struct Edge{ int u,v,cap,flow,cost;
}; struct MCMF {
int n,m,s,t;
int inq[maxn],a[maxn],d[maxn],p[maxn];
vector<int> G[maxn];
vector<Edge> es; void init(int n) {
this->n=n;
es.clear();
for(int i=;i<n;i++) G[i].clear();
}
void AddEdge(int u,int v,int cap,int cost) {
es.push_back((Edge){u,v,cap,,cost});
es.push_back((Edge){v,u,,,-cost});
m=es.size();
G[u].push_back(m-);
G[v].push_back(m-);
} bool SPFA(int s,int t,int& flow,int& cost) {
for(int i=;i<n;i++) d[i]=INF;
memset(inq,,sizeof(inq));
d[s]=; inq[s]=; p[s]=; a[s]=INF;
queue<int> q; q.push(s);
while(!q.empty()) {
int u=q.front(); q.pop(); inq[u]=;
for(int i=;i<G[u].size();i++) {
Edge& e=es[G[u][i]];
int v=e.v;
if(e.cap>e.flow && d[v]>d[u]+e.cost) {
d[v]=d[u]+e.cost;
p[v]=G[u][i];
a[v]=min(a[u],e.cap-e.flow); //min(a[u],..)
if(!inq[v]) { inq[v]=; q.push(v);
}
}
}
}
if(d[t]==INF) return false;
flow+=a[t] , cost+=a[t]*d[t];
for(int x=t; x!=s; x=es[p[x]].u) {
es[p[x]].flow+=a[t]; es[p[x]^].flow-=a[t];
}
return true;
}
int Mincost(int s,int t,int& cost) {
int flow=; cost=;
while(SPFA(s,t,flow,cost)) ;
return flow;
}
} mc; int n; int main() {
while(scanf("%d",&n)== && n) {
mc.init(n+n+);
int s=n+n,t=s+;
int u,v,w;
FOR(u,,n) {
while(scanf("%d",&v)== && v) {
scanf("%d",&w);
v--;
mc.AddEdge(u,n+v,,w);
}
mc.AddEdge(s,u,,); mc.AddEdge(u+n,t,,);
}
int flow,cost;
flow=mc.Mincost(s,t,cost);
if(flow<n) printf("N\n");
else printf("%d\n",cost);
}
return ;
}

最新文章

  1. Java 理论与实践: 正确使用 Volatile 变量--转
  2. 初学者-ASCII码 数字转字母
  3. 使用JavaScript实现复选框全选与取消的功能
  4. day26_网络编程第一天
  5. JVM学习之jstat使用方法
  6. [LeetCode]题解(python):033-Search in Rotated Sorted Array
  7. POJ 2385 DP
  8. 使用SQLdiag Utility搜集SQL Server诊断信息
  9. 【HDOJ】2045 不容易系列之(3)—— LELE的RPG难题
  10. ubuntu系统下创建软件桌面快捷方式
  11. cocos2d-x项目过程记录(跨平台iOS和Android)
  12. 安装VMware vCenter过程设置数据库方法
  13. jmeter配置、安装
  14. Java课程设计——象棋(201521123042 姚佳希)
  15. JavaWeb中jsp九大内置对象 和四大作用域
  16. 《物联网框架ServerSuperIO教程》- 23.动态数据接口增加缓存,提高数据输出到OPCServer和(实时)数据库的效率
  17. JQuery复习心得
  18. 【团队】EasyKing的实现_1
  19. bash:command not found解决方法
  20. SQL调优(SQL TUNING)并行查询提示(Hints)之pq_distribute的使用

热门文章

  1. 详细分析Orchard的Content、Drivers, Shapes and Placement 类型
  2. Wpf 鼠标拖动元素实例
  3. LinkedIn第三方登录
  4. ssh框架配置事务管理器
  5. PL/SQL Developer简单使用
  6. linux设置中文环境
  7. [转]PHP echo, print, printf, sprintf函数的区别和使用
  8. SOAPUI请求及mockservice 使用
  9. css去除webkit内核的默认样式
  10. PHP常用代码: