uva 1201
2014-11-22 12:11
351 查看
题目链接: http://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&page=show_problem&category=560&problem=3642&mosmsg=Submission+received+with+ID+14567822
201
大白书:357页。
模型:最小路径覆盖
定义:在途中找尽量少的路径,使得每个节点恰好在一条路径上,也就是说,不同的路径不能有公共点。
在本题中,我们可以将客人按照时间的先后顺序来排序,排完后如果同一辆出租车在接完客人u后能够来得及去接客人v,那么就连一条边u->v,我们可以发现,这是一个DAG,在DAG上求最小路径覆盖的话,我们得将每个点都拆分为X节点i和Y节点i',这样就构成了个二分图,如果存在有向边i->j,那么就在二分图中引入i->j'的边,可以知道,一条边就是代表一辆车,那么求的就是最小路径覆盖,在二分图中,最小路径覆盖 = n - 最大匹配(详细证明见大白书357)。
201
大白书:357页。
模型:最小路径覆盖
定义:在途中找尽量少的路径,使得每个节点恰好在一条路径上,也就是说,不同的路径不能有公共点。
在本题中,我们可以将客人按照时间的先后顺序来排序,排完后如果同一辆出租车在接完客人u后能够来得及去接客人v,那么就连一条边u->v,我们可以发现,这是一个DAG,在DAG上求最小路径覆盖的话,我们得将每个点都拆分为X节点i和Y节点i',这样就构成了个二分图,如果存在有向边i->j,那么就在二分图中引入i->j'的边,可以知道,一条边就是代表一辆车,那么求的就是最小路径覆盖,在二分图中,最小路径覆盖 = n - 最大匹配(详细证明见大白书357)。
/* * ThinkingLion.cpp * * Created on: 2014年11月22日 * Author: dell */ #include<stdio.h> #include<iostream> #include<string> #include<string.h> #include<algorithm> #include<iomanip> #include<vector> #include<time.h> #include<queue> #include<stack> #include<iterator> #include<math.h> #include<stdlib.h> #include<limits.h> //#define ONLINE_JUDGE #define eps 1e-8 #define INF 0x7fffffff #define FOR(i,a) for((i)=0;i<(a);(i)++) #define MEM(a) (memset((a),0,sizeof(a))) #define sfs(a) scanf("%s",a) #define sf(a) scanf("%d",&a) #define sfI(a) scanf("%I64d",&a) #define pf(a) printf("%d\n",a) #define pfs(a) printf("%s\n",a) #define pfI(a) printf("%I64d\n",a) #define sfd(a,b) scanf("%d%d",&a,&b) #define for1(i,a,b) for(int i=(a);i<b;i++) #define for2(i,a,b) for(int i=(a);i<=b;i++) #define clr1(a) memset(a,0,sizeof(a)) #define clr2(a) memset(a,-1,sizeof(a)) #define ll __int64 const double PI=acos(-1.0); template<class T> T gcd(T a,T b){return b?gcd(b,a%b):a;} template<class T> T lcm(T a,T b){return a/gcd(a,b)*b;} template<class T> inline T Min(T a,T b){return a<b?a:b;} template<class T> inline T Max(T a,T b){return a>b?a:b;} using namespace std; int n; #define N 510 struct Node{ int hr,mi; int x1,y1; int x2,y2; int s; bool operator < (const Node &x) const{ return s<x.s; } }p ; struct BPM{ int n,m; vector<int> G ; int left ; int right ; int S ; int T ; void Init(int n,int m){ this->n=n; this->m=m; for(int i=0;i<=n;i++) G[i].clear(); } void addEdge(int u,int v){ G[u].push_back(v); } bool dfs(int u){ for(int i=0;i<(int)G[u].size();i++){ int v=G[u][i]; if(!T[v]){ T[v]=1; if(left[v] == -1 || dfs(left[v])){ left[v] = u; right[u] = v; return 1; } } } return false; } int match(){ int ans=0; memset(T,0,sizeof T); memset(left,-1,sizeof left); memset(right,-1,sizeof right); for(int i=1;i<=n;i++){ memset(T,0,sizeof T); if(dfs(i)) ans++; } return ans; } }; bool Check(int i,int j){ int dif = p[i].s + abs(p[i].x2-p[i].x1)+abs(p[i].y2-p[i].y1)+abs(p[i].x2-p[j].x1)+abs(p[i].y2-p[j].y1); if(dif < p[j].s) return true; return false; } BPM solver; int main() { #ifndef ONLINE_JUDGE freopen("in.txt","r",stdin); // freopen("out.txt","w",stdout); #endif int t; scanf("%d",&t); while(t--){ sf(n); solver.Init(n,0); for(int i=1;i<=n;i++){ scanf("%d:%d %d %d %d %d",&p[i].hr,&p[i].mi,&p[i].x1,&p[i].y1,&p[i].x2,&p[i].y2); p[i].s = p[i].hr*60+p[i].mi; } sort(p+1,p+n+1); for(int i=1;i<=n;i++){ for(int j=i+1;j<=n;j++){ if(Check(i,j)) solver.addEdge(i,j); } } int ans = n - solver.match(); printf("%d\n",ans); } return 0; }
相关文章推荐
- UVA-1201 - Taxi Cab Scheme(POJ-2060)--DAG的最小路径覆盖
- UVA 1201 Taxi Cab Scheme(最小路径覆盖)
- uva 1201 最小路径覆盖 最大匹配
- uva1201 DAG 最小路径覆盖,转化为 二分图
- uva 1201 - Taxi Cab Scheme(二分图匹配)
- Uva-1201-Taxi Cab Scheme
- UVA 1201 - Taxi Cab Scheme(二分图匹配+最小路径覆盖)
- uva 10673 - Play with Floor and Ceil
- 计算几何专项:UVa 11646
- UVA 11367 Full Tank?(bfs最短路)
- uva 12086 树状数组
- UVa 10935 Throwing cards away I
- UVa 11137 - Ingenuous Cubrency
- UVa-455 Periodic Strings
- UVA 340 Master-Mind Hints
- uva 202 Repeating Decimals
- [Uva 1001] Say Cheese [Floyd]
- Uva 12493 Stras(欧拉函数)
- Uva 10976
- uva 350 - Pseudo-Random Numbers