您的位置:首页 > 其它

POJ1034 The dog task

2013-08-01 16:46 274 查看
题目来源:http://poj.org/problem?id=1034

题目大意:

  一个猎人在遛狗。猎人的路径由一些给定的点指定。狗跟随着猎人,要与主人同时到达那些指定的点。在丛林里有一些有趣的地方,狗很喜欢去。狗在从一个指定点到达另一个指定点之间最多可以去访问一个有趣的地方。每个有趣的地方狗最多去访问一次。猎人总是匀速沿直线从一个点去往下一个点,狗的速度不超过猎人速度的两倍。(如下图,图中直线为猎人路线,虚线为狗的路径,黑点为有趣的地方。)

//////////////////////////////////////////////////////////////////////////
//        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
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: