A fishmonger wants to bring his goods from the port to the market. On his route he has to traverse an area with many tiny city states. Of course he has to pay a toll at each border.
Because he is a good business man, he wants to choose the route in such a way that he has to pay as little money for tolls as possible. On the other hand, he has to be at the market within a certain time, otherwise his fish start to smell.
Input
The first line contains the number of states n and available time t. The first state is the port, the last state is the market. After this line there are n lines with n numbers each, specifying for each state the travel time to the i-th state. This table is terminated with an empty line. The table of the tolls follows in the same format.
n is at least 3 and at most 50. The time available is less than 1000. All numbers are integers.
There are many test cases separated by an empty line. Input terminates with number of states and time equal 0 0.
Output
For each test case your program should print on one line the total amount of tolls followed by the actual travelling time.
Example
Sample input:
4 7
0 5 2 3
5 0 2 3
3 1 0 2
3 3 2 0
0 2 2 7
2 0 1 2
2 2 0 5
7 2 5 0
0 0
Sample output:
6 6
This corresponds to the following situation, the connections are labeled with (time, toll):
#include <cstdio>
#include <cstring>
#include <cstdlib>
#define INF 0x3f3f3f3f
using namespace std;
int n,k;
int cost[123][123];
int time[123][123];
int vis[123];
int CV,CB;
void dfs(int x, int c, int t)
{
if(x==n-1)
{
if(CV>c)
{
CV = c;
CB = t;
}
return;
}
for(int i=0; i<n; i++)
{
if(vis[i]==0&&time[x][i]+t<=k&&cost[x][i]<=CV)//剪枝
{
vis[i] = 1;
dfs(i, c+cost[x][i], t+time[x][i]);
vis[i] = 0;
}
}
}
int main()
{
while(~scanf("%d %d",&n, &k))
{
if(n==0&&k==0)
break;
for(int i=0; i<n; i++)
{
for(int j=0; j<n; j++)
{
scanf("%d", &time[i][j]);
}
}
for(int i=0; i<n; i++)
{
for(int j=0; j<n; j++)
{
scanf("%d", &cost[i][j]);
}
}
memset(vis, 0, sizeof(vis));
vis[0] = 1;
CV = INF;
CB = 0;
dfs(0, 0, 0);
printf("%d %d\n", CV, CB);
}
return 0;
}
本文介绍了一个鱼贩如何在有限时间内选择穿过多个小城邦的最佳路线,以便支付最少的过路费并及时到达市场。通过递归深度优先搜索算法,考虑时间和费用限制,找到满足条件的最佳路径。
2677

被折叠的 条评论
为什么被折叠?



