poj1034 The dog task 最大匹配
题目讲的是主人出去遛狗。图中有n个景点和m个好玩的地方,主人要沿直线走完n个景点,主人和狗的起点、终点一样,途中狗会离开主人去去一个好玩的地方(每次最多只能一个)并在下一个景点与主人会合,狗的速度是主人的两倍。问最多狗能去几个地方(景点数+能去的最多好玩地方),并且输出狗的行走路线;
构图:把主人走的路段作为X部,景点作为Y部。如果狗在某个路段能到达某个景点就将这两个连线。套用模板求得最大匹配即为狗能到达的最多好玩地方,再加上景点数即可;
Source Code
Problem: 1034 | User: 541780774 | |
Memory: 416K | Time: 63MS | |
Language: G++ | Result: Accepted |
Source Code
#include<stdio.h> #include<stdlib.h> #include<string.h> #include<math.h> int nx, ny; // X的點數目、Y的點數目 int mx[101], my[101]; // X各點的配對對象、Y各點的配對對象 bool vy[101]; // 紀錄Graph Traversal拜訪過的點 bool adj[101][101]; // 精簡過的adjacency matrix // 以DFS建立一棵交錯樹 bool DFS(int x) { for (int y=0; y<ny; ++y) if (adj[x][y] && !vy[y]) { vy[y] = true; // 找到擴充路徑 if (my[y] == -1 || DFS(my[y])) { mx[x] = y; my[y] = x; return true; } } return false; } int bipartite_matching() { // 全部的點初始化為未匹配點。 memset(mx, -1, sizeof(mx)); memset(my, -1, sizeof(my)); // 依序把X中的每一個點作為擴充路徑的端點, // 並嘗試尋找擴充路徑。 int c = 0; for (int x=0; x<nx; ++x) // if (mx[x] == -1) // x為未匹配點,這行可精簡。 { // 開始Graph Traversal memset(vy, false, sizeof(vy)); if (DFS(x)) c++; } return c; } main() { int i,j,n,m,p[101][2],q[101][2],ans; double a,b,c; while(scanf("%d%d",&n,&m)!=EOF) { memset(adj,0, sizeof(adj)); for(i=0;i<n;i++) scanf("%d%d",&p[i][0],&p[i][1]); for(i=0;i<m;i++) scanf("%d%d",&q[i][0],&q[i][1]); for(i=0;i<n-1;i++) for(j=0;j<m;j++) { a=sqrt(pow(p[i][0]-p[i+1][0],2)+pow(p[i][1]-p[i+1][1],2)); b=sqrt(pow(q[j][0]-p[i][0],2)+pow(q[j][1]-p[i][1],2)); c=sqrt(pow(q[j][0]-p[i+1][0],2)+pow(q[j][1]-p[i+1][1],2)); if(b+c<=2*a) adj[i][j]=1; } nx=n-1; ny=m; printf("%d\n",n+bipartite_matching()); printf("%d %d ",p[0][0],p[0][1]); for(i=0;i<n-1;i++) { if(my[mx[i]]==i) printf("%d %d ",q[mx[i]][0],q[mx[i]][1]); if(i!=n-2) printf("%d %d ",p[i+1][0],p[i+1][1]); } printf("%d %d\n",p[n-1][0],p[n-1][1]); } system("pause"); }
转载于:https://www.cnblogs.com/zxj015/archive/2011/02/12/2740286.html
poj1034 The dog task 最大匹配相关推荐
- POJ前面的题目算法思路【转】
1000 A+B Problem 送分题 49% 2005-5-7 1001 Exponentiation 高精度 85% 2005-5-7 1002 487-3279 n/a 90% 2005-5- ...
- NOIP 好题推荐(DP+搜索+图论)POJ ZOJ
NOIP好题推荐(DP+搜索+图论)POJ ZOJ 1370 Gossiping (数论->模线性方程有无解的判断)+(图论->DFS) 1090 Chain ->格雷码和二进制码 ...
- POJ 超详细分类
POJ 各题算法 1000 A+B Problem 送分题 49% 2005-5-7 1001 Exponentiation 高精度 ...
- 如何使用Ajax技术开发Web应用程序(2)
在上一篇文章中,我们讨论了如何通过javascript从一个远程XML文件中取得数据.在这篇文章中,我们将学会怎样对数据作更复杂的处理.作为一个示例,我们会准备一组XML数据,将数据分割成独立的片断并 ...
- 高通驱动开发参考(二)
第1章 Driver相关模块介绍 1.1 REX简介 虽说目前QSC60x5平台上采用L4操作系统,REX只是L4上面的一个Task.但高通为了开发的兼容性,提供的API仍然采用老的一套接口(可能内部 ...
- Python 迁移学习实用指南:1~5
原文:Hands-On Transfer Learning with Python 协议:CC BY-NC-SA 4.0 译者:飞龙 本文来自[ApacheCN 深度学习 译文集],采用译后编辑(MT ...
- HDU - 3829 Cat VS Dog(最大独立集-二分图最大匹配)
题目链接:点击查看 题目大意:给出n只狗和m只猫,现在有p个小朋友,每个小朋友都有一只喜欢的猫和一只不喜欢的狗,或者有一只喜欢的狗和一只不喜欢的猫,如果一个小朋友喜欢的动物还在,不喜欢的动物走了,那么 ...
- HDU - 2444——The Accomodation of Students(判断二分图,二分图最大匹配)
题意: 题意: 有n个人,m对人相互认识: 问能否分成两个组,组内任意两个人之间不认识: 若不能,则输出No: 若能,则相互认识的两个人一间房,求最多需要几间房: 给出一些学生的认识情况,比如A和B认 ...
- 【HDU - 2444】The Accomodation of Students(二分图判断 + 匈牙利算法求最大匹配)
题干: There are a group of students. Some of them may know each other, while others don't. For example ...
最新文章
- 台湾国立大学郭彦甫Matlab教程笔记(16) 数值微分 numerical differentiation
- stm32串口学习(一)
- linux 日志报告生成器,linux实战(一)----日志的截取-----文本过滤器grep、文本流式编辑器sed、报表生成器awk的运用...
- 《大话设计模式》Python 版代码实现
- MIP技术进展月报第2期: 数据绑定,异步脚本加速
- python分词统计词频_python jieba分词并统计词频后输出结果到Excel和txt文档方法
- C#调用系统蜂鸣(需要发出警告时挺好用的 即使没有声卡)
- Git—如何Windows操作系统中安装Git
- 信息熵,交叉熵,KL散度,JS散度之间的关系
- 香港股票交易成本计算器 android,股票交易手续费计算器
- 买到春节回家的票了吗?用Python刷票,还不快来试试!(建议收藏) 为回家做准备...
- c语言表达式判断语法错误题,C语言数据类型与表达式习题及答案.doc
- Java 使用嵌套 for 循环打印皇冠
- MySQL 5.7 中文全文检索
- 逆向工具Cutter
- java faker_Faker--伪造数据利器
- Java标识符规范书写规则
- 一些开源软件的国内镜像源
- 关于小红书的小程序不同数量的轮播图,展示不一样的轮播指示点的实现
- 三次B样条曲线拟合算法