DAG镶嵌模型+原始路径打印

DP矩形镶嵌,打印路径与最长公共子序列相似。

 1 #include<stdio.h>
 2 #include<string.h>
 3 #define doumax(a,b) (a>b?a:b)
 4 const int maxn=100;
 5 int mat[maxn][maxn],dp[maxn],n;
 6 struct node{
 7     int a;
 8     int b;
 9     void dousort(void)
10     {
11         if(a<b){
12             int temp=a;
13             a=b;
14             b=temp;
15         }
16     }
17     bool operator<(const node & t)
18     {
19         return t.a>a && t.b>b;
20     }
21     void operator=(const node & t)
22     {
23         a=t.a;b=t.b;
24     }
25 }rect[maxn],rectinit[maxn];
26 int dpmodel(int i);
27 void print_road(int i);
28 int main()
29 {
30     while(scanf("%d",&n)==1){
31         for(int i=1;i<=n;i++){
32             scanf("%d%d",&rect[i].a,&rect[i].b);
33             rectinit[i]=rect[i];
34             rect[i].dousort();
35         }
36         memset(mat,0,sizeof(mat));
37         memset(dp,0,sizeof(dp));
38         for(int i=1;i<=n;i++)
39             for(int j=i+1;j<=n;j++){
40                 if(rect[i]<rect[j])
41                     mat[i][j]=1;
42                 else if(rect[j]<rect[i])
43                     mat[j][i]=1;
44             }
45         int maxroad=0,maxi;
46         for(int i=1;i<=n;i++){
47             if(maxroad<dpmodel(i)){
48                  maxroad=dpmodel(i);
49                  maxi=i;
50             }
51         }
52         printf("%d\n",maxroad);
53         print_road(maxi);
54     }
55     return 0;
56 }
57 int dpmodel(int i)
58 {
59     if(dp[i]>0)
60         return dp[i];
61     dp[i]=1;
62     for(int j=1;j<=n;j++)
63         if(mat[i][j])
64         dp[i]=doumax(dp[i],dpmodel(j)+1);
65     return dp[i];
66 }
67 void print_road(int i)
68 {
69     printf("(%d,%d)\n",rectinit[i].a,rectinit[i].b);
70     if(dp[i]==1)
71         return;
72     for(int j=1;j<=n;j++)
73     if(mat[i][j] && dp[i]==dp[j]+1){
74         print_road(j);
75         return;
76     }
77 }


DAG镶嵌模型+原始路径打印

时间: 2024-10-14 01:40:07

DAG镶嵌模型+原始路径打印的相关文章

UVAlive3126 Taxi Cab Scheme(DAG的最小路径覆盖)

题目链接:http://acm.hust.edu.cn/vjudge/problem/viewProblem.action?id=32568 [思路] DAG的最小路径覆盖. 将每个人看做一个结点,如果时间允许到达就连边,则问题转化为DAG上的最小路径覆盖问题,即找到最少的路径使得每个点位于一条路径上. 算法:将DAG中的每个结点u拆分成2个为u1,u2,如果DAG中有边uv则连边u1-v2.如果该二分图的最大匹配数为ans,则答案为n-ans.可以这样想:在一条路径中除尾结点外其他结点都有且仅

The Pilots Brothers&#39; refrigerator-DFS路径打印

I - The Pilots Brothers' refrigerator Time Limit:1000MS     Memory Limit:65536KB     64bit IO Format:%I64d & %I64u Submit Status Description The game "The Pilots Brothers: following the stripy elephant" has a quest where a player needs to op

POJ - 1422 Air Raid(DAG的最小路径覆盖数)

1.一个有向无环图(DAG),M个点,K条有向边,求DAG的最小路径覆盖数 2.DAG的最小路径覆盖数=DAG图中的节点数-相应二分图中的最大匹配数 3. /* 顶点编号从0开始的 邻接矩阵(匈牙利算法) 二分图匹配(匈牙利算法的DFS实现)(邻接矩阵形式) 初始化:g[][]两边顶点的划分情况 建立g[i][j]表示i->j的有向边就可以了,是左边向右边的匹配 g没有边相连则初始化为0 uN是匹配左边的顶点数,vN是匹配右边的顶点数 左边是X集,右边是Y集 调用:res=hungary();输

exam1802 Bounty Hunter II(DAG的最小路径覆盖)

原文:http://www.cnblogs.com/jackiesteed/articles/2043934.html DAG的最小路径覆盖是指找最小数目的互相不相交的有向路径,满足DAG的所有顶点都被覆盖. 首先给出公式:DAG的最小路径覆盖数=DAG图中的节点数-相应二分图中的最大匹配数. 那么对应一个DAG,如何构造相应的二分图?对于DAG中的一个顶点p,二分图中有两个顶点p和p',对应DAG中的一条有向边p->q,二分图中有p-q'的一条无向边.二分图中p属于S集合,p'属于T集合. 下

UVALive-3126 Taxi Cab Scheme (DAG的最小路径覆盖)

题目大意:要给n个人安排车,已知每个人的出发时间和起点与终点,问最少需要安排几辆车才能完成任务. 题目分析:最小路径覆盖.如果送完a到目的地后能在b出发之前赶来接b,那么连一条有向边a->b,最终将得到一个DAG.最少路径覆盖数便是答案.解法:把所有节点 i 拆成 i 和 i’,如果 i 和 j 之间连有一条边,那么则在二分图中连接 i->j’.最少路径覆盖数便是 n-最大匹配数. 代码如下: # include<iostream> # include<cstdio>

UVA - 624CD(递推+ 路径打印)

题目: UVA - 624CD(递推+ 路径打印) 题目大意:给出一组数据,给定一个N,问这些数据能否拼凑出不大于N的最接近N的数据,可以的话输出最接近N的数据,并且打印出最长路径(要求要找输入的顺序). 解题思路:dp[j]:代表凑出J这个数值最多需要几个数.d[j] = Max (d[j - v[i]] + 1. 打印路径,如果取得是最小值,那么顺着dp标记的值的减小就可以找到路径,但是取的是最大值,这样它的下一个并不能直接靠dp数组的值来判断,而是要判断到最后是否最终的值等于0.用回溯.

POJ 3984 迷宫问题(简单bfs+路径打印)

传送门: http://poj.org/problem?id=3984 迷宫问题 Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 33105   Accepted: 18884 Description 定义一个二维数组: int maze[5][5] = { 0, 1, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 0, 0, 0, 0, 1, 0, }; 它表示一个

HDU ACM 1026 Ignatius and the Princess I -&gt; BFS+优先队列+路径打印

分析:在BFS中使用优先队列即可获取最小值. #include<iostream> #include<queue> using namespace std; //BFS+优先队列(打印路径) #define N 101 struct Node //节点 { int x,y,time; friend bool operator<(const Node& a,const Node& b) //有限队列根据时间做依据 { return a.time>b.tim

无向图欧拉道路(欧拉回路)的判定与路径打印

欧拉道路描述的是无向图的一个顶点出发的一条道路能够经过每条边恰好一次 欧拉回路指的是任意点出发都满足上述性质 如果一个图是欧拉道路或者欧拉回路,必须满足两个条件 第一个条件,这个图是连通图 第二个条件,所有点的度数满足"一定的关系" 然后我们阐述一下"一定的关系"是什么 检查这个图所有点的度数,求出这个图度数给奇数的点的个数,我们也可以称之为奇点数 如果没有奇点,这个图是一个欧拉回路,从任意点出发可以经过所有的边并回到这个点 如果存在两个奇点(这两个奇点具有这样的性