您的位置:首页 > 其它

【dfs && 剪枝】SPOJ FISHER Fishmonger

2018-01-24 09:00 471 查看
Problem Description

给你n,k分别代表n个点,1点要到达n点不能超过k的时间。

给你n个点,1点是起点,n点是终点。给你两个n*n的矩阵,分别代表任意两点间移动需要的时间,任意两点间移动需要的花费。

让你求1点到达n点不能超过k的时间的前提下的最小花费。

输出最小花费和所用的时间。

思路:

就是求1->n在时间不超过k的情况下的最小花费。

我们可以考虑dfs,然后剪纸一下,条件就是到达当前点花费大于到达n点的花费 && 时间超过了k

#include<bits/stdc++.h>
using namespace std;
const int inf = 0x3f3f3f3f;
struct node
{
int Time, Cost;
};
node a[55][55];
int n, k, vis[55];
int ansT, ansC;
void dfs(int u, int cT, int cC)//当前点,当前时间,当前花费
{
if(u == n)//到达目的点
{
if(cC < ansC && cT <= k)//如果花费更小就更新
ansC = cC, ansT = cT;
}
else
{
for(int i = 1; i <= n; i++)
{
if(i == u) continue;
if(!vis[i] && (cT + a[u][i].Time) <= k && (cC+a[u][i].Cost) < ansC)//两个剪纸条件
{
vis[i] = 1;
dfs(i, cT+a[u][i].Time, cC+a[u][i].Cost);
vis[i] = 0;
}
}
}
}
int main()
{
while(~scanf("%d %d", &n, &k) && (n || k))
{
for(int i = 1; i <= n; i++)
for(int j = 1; j <= n; j++)
scanf("%d", &a[i][j].Time);
for(int i = 1; i <= n; i++)
for(int j = 1; j <= n; j++)
scanf("%d", &a[i][j].Cost);
ansT = inf, ansC = inf;
memset(vis, 0, sizeof(vis));
vis[1] = 1;
dfs(1, 0, 0);
printf("%d %d\n", ansC, ansT);
}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: