POJ1034 The dog task
2013-08-01 16:46
274 查看
题目来源:http://poj.org/problem?id=1034
题目大意:
一个猎人在遛狗。猎人的路径由一些给定的点指定。狗跟随着猎人,要与主人同时到达那些指定的点。在丛林里有一些有趣的地方,狗很喜欢去。狗在从一个指定点到达另一个指定点之间最多可以去访问一个有趣的地方。每个有趣的地方狗最多去访问一次。猎人总是匀速沿直线从一个点去往下一个点,狗的速度不超过猎人速度的两倍。(如下图,图中直线为猎人路线,虚线为狗的路径,黑点为有趣的地方。)
View Code
题目大意:
一个猎人在遛狗。猎人的路径由一些给定的点指定。狗跟随着猎人,要与主人同时到达那些指定的点。在丛林里有一些有趣的地方,狗很喜欢去。狗在从一个指定点到达另一个指定点之间最多可以去访问一个有趣的地方。每个有趣的地方狗最多去访问一次。猎人总是匀速沿直线从一个点去往下一个点,狗的速度不超过猎人速度的两倍。(如下图,图中直线为猎人路线,虚线为狗的路径,黑点为有趣的地方。)
////////////////////////////////////////////////////////////////////////// // POJ1034 The dog task // Memory: 296K Time: 47MS // Language: C++ Result: Accepted ////////////////////////////////////////////////////////////////////////// #include <iostream> #include <math.h> using namespace std; struct Point{ int x; int y; }; bool graph[101][101]; Point hunterRoute[101]; int hunterRouteCnt; Point interestingPlaces[101]; int interestingPlacesCnt; int link[101]; int ans[101]; int linkCnt; bool visited[101]; void readData() { cin >> hunterRouteCnt >> interestingPlacesCnt; for (int i = 1; i <= hunterRouteCnt; ++i) { cin >> hunterRoute[i].x >> hunterRoute[i].y; } for (int i = 1; i <= interestingPlacesCnt; ++i) { cin >> interestingPlaces[i].x >> interestingPlaces[i].y; } } bool check (int x, int y) { double x1 = hunterRoute[x].x; double y1 = hunterRoute[x].y; double x2 = hunterRoute[x + 1].x; double y2 = hunterRoute[x + 1].y; double xd = interestingPlaces[y].x; double yd = interestingPlaces[y].y; double distance1 = sqrt((x1 - x2) * (x1 - x2) + (y1 - y2) * (y1 - y2)); double distance2 = sqrt((x1 - xd) * (x1 - xd) + (y1 - yd) * (y1 - yd)); double distance3 = sqrt((xd - x2) * (xd - x2) + (yd - y2) * (yd - y2)); return distance2 + distance3 <= distance1 * 2 ? true : false; } void createGraph() { memset(graph, false, sizeof(graph)); for (int i = 1; i < hunterRouteCnt; ++i) { for (int j = 1; j <= interestingPlacesCnt; ++j) { graph[i][j] = check(i, j); } } } bool dfs(int i) { for (int k = 1; k <= interestingPlacesCnt; ++k) { if (graph[i][k] == true && visited[k] == false) { visited[k] = true; if (link[k] == 0 || dfs(link[k])) { link[k] = i; ans[i] = k; return true; } } } return false; } void findMaxMatch() { memset(ans, 0, sizeof(ans)); memset(link, 0, sizeof(link)); linkCnt = 0; for (int i = 1; i < hunterRouteCnt; ++i) { memset(visited, false, sizeof(visited)); if (dfs(i) == true) { ++linkCnt; } } } void output() { cout << linkCnt + hunterRouteCnt<<endl; for (int i = 1; i < hunterRouteCnt; ++i) { cout << hunterRoute[i].x << " " << hunterRoute[i].y << " "; if (ans[i] != 0) { cout << interestingPlaces[ans[i]].x << " " << interestingPlaces[ans[i]].y << " "; } } cout << hunterRoute[hunterRouteCnt].x << " " << hunterRoute[hunterRouteCnt].y; } int main() { while (cin >> hunterRouteCnt >> interestingPlacesCnt) { memset(graph,false,sizeof(graph)); for (int i = 1; i <= hunterRouteCnt; ++i) { cin >> hunterRoute[i].x >> hunterRoute[i].y; } for (int i = 1; i <= interestingPlacesCnt; ++i) { cin >> interestingPlaces[i].x >> interestingPlaces[i].y; } createGraph(); findMaxMatch(); output(); } system("pause"); return 0; }
View Code
相关文章推荐
- poj 1034 The dog task (二分匹配)
- poj 1034 The dog task
- poj 1034 The dog task
- POJ 1034 The dog task 笔记
- POJ 1034 The dog task(二分图匹配)
- POJ 1034 The Dog Task
- poj1034 The dog task 最大匹配
- UVa670 - The dog task(最大二分匹配)
- UVa 670 - The dog task
- 二分图最大匹配(匈牙利算法) UVA 670 The dog task
- uva 670 The dog task
- UVA 670 The dog task【二部图最大匹配 邻接表DFS】
- poj 2761 feeding the dog (splay树 模板)
- POJ 35588 The Downloading Task 可能会
- ZJU2039 The Dog Task - 二部图最大匹配
- poj 1887 Testing the CATCHER
- poj 1679 The Unique MST
- poj 2965.The Pilots Brothers' refrigerator
- poj 2151 Check the difficulty of problems (dp,概率)
- POJ 2886 Who Gets the Most Candies(线段树模拟约瑟夫环)