您的位置:首页 > 其它

PAT 甲级 1018 Public Bike Management

2018-02-28 23:29 295 查看
DFS+记忆化搜索剪枝

没试过不剪枝会不会超时。

注意点就是没有返回修改这个说法

10 4 4 5

3 5 5 10

0 1 1

0 2 1

1 3 1

2 3 1

3 4 1

这组数据出来的结果是 0 0->2->3->4 5

别的应该没什么问题…判断语句写的好搓

更新 不剪枝直接爆搜也不会超时…

#include <iostream>
#include <cstdio>
#include <algorithm>
#include <cstring>
#include <cmath>
#include <vector>
#include <queue>
#include <stack>
using namespace std;
struct node
{
int len;
int id;
};

int C, n, sp, m;
int c[505];
int d[505];
int pren[505];
vector<node> v[505];
vector<int> route;
int resto, resback, ans;
bool flag[505];
void getroute()
{
pren[0] = -1;
route.clear();
int temp = sp;
while (pren[temp] != -1)
{
route.push_back(temp);
temp = pren[temp];
}
route.push_back(0);
}
void dfs(int st, int ed, int l, int to,int back, int pre)
{
if (st == ed)
{
if (ans > l || ans == -1)
{
pren[ed] = pre;
getroute();
ans = l;
resto = to;
resback = back;
}
else if (ans == l)
{
if (to < resto)
{
resto = to;
resback = back;
pren[ed] = pre;
getroute();
}
else if (to == resto)
{
if (back < resback)
{
resback = back;
pren[ed] = pre;
getroute();
}
}
}
}
else
{
for (int i = 0; i < v[st].size(); i++)
{
if (flag[v[st][i].id] == 1) continue;
int temp = l + v[st][i].len;
if (d[v[st][i].id] == -1 || d[v[st][i].id] >= temp)
{
int nextp = v[st][i].id;
d[nextp] = temp;
pren[nextp] = st;
flag[nextp] = 1;
int tempb = back + c[nextp] - C / 2;
int tempto = to;
if (tempb <= 0)
{
tempto = to - tempb;
tempb = 0;
}
dfs(nextp, ed, temp, tempto, tempb, st);
flag[nextp] = 0;
}
}
}
}

int main()
{
while (~scanf("%d%d%d%d", &C, &n, &sp, &m))
{
memset(d, -1, sizeof(d));
for (int i = 0; i <= n; i++)
{
v[i].clear();
}
int a, b, l;
for (int i = 1; i <= n; i++)
{
scanf("%d", &c[i]);
}
for (int i = 1; i <= m; i++)
{
scanf("%d%d%d", &a, &b, &l);
node t1;
t1.id = b;
t1.len = l;
v[a].push_back(t1);
node t2;
t2.id = a;
t2.len = l;
v[b].push_back(t2);
}
ans = -1;
memset(flag, 0, sizeof(flag));
flag[0] = 1;
resto = -1;
resback = -1;
route.clear();
route.push_back(0);
dfs(0, sp, 0, 0, 0, 0);
if (resto < 0) printf("0 ");
else printf("%d ", resto);
for (int i = route.size() - 1; i >= 0; i--)
{
printf("%d", route[i]);
if (i == 0) printf(" ");
else printf("->");
}
if (resback < 0) printf("0");
else printf("%d", resback);
printf("\n");
}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: