其实也是简单的dp,还可以把价格看成是权值用最短路来写,求出所要买的商品到各点的商品用最短距离;
这个和376其实是一样的思路就是用深搜的。
#include <stdio.h>
#include <string.h>
#include <iostream>
#include <algorithm>
#include <vector>
using namespace std;
int dp[1005],flag[1005],cost[1005];
vector <int> g[1010];
void dfs(int x)
{
int k;
flag[x]=1; //已经搜过了,并且会不断搜,然后搜到结果
if(g[x].size()==0)
{
dp[x]=cost[x];
return ;
}
for(int i =0; i<g[x].size();i++)
{
k=g[x][i];
if(flag[k]==0) //还没有搜索过结果
dfs(k);
dp[x]=min(dp[x],cost[x]+dp[k]);
}
}
int main()
{
int t, n, m, p;
scanf("%d", &t);
for(int k = 1; k <=t; k++)
{
printf("Case #%d: ",k);
scanf("%d%d%d", &n, &m, &p);
cost[0]=0;
for(int i =1; i<=n; i++)
{
scanf("%d", &cost[i]);
g[i].clear(); //清空;
dp[i]=9999999;
}
while(m--)
{
int x, y;
scanf("%d%d", &x, &y);
g[x].push_back(y);
}
memset(flag, 0, sizeof(flag));
dfs(p); //从上往下搜索.
printf("%d\n",dp[p]);
}
}