生活随笔
收集整理的這篇文章主要介紹了
NYOJ 679 贪婪的商店
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
貪婪的商店
時間限制:
1000?ms ?|? 內存限制:
65535?KB 難度:
3
描述
小明星期天去一家商店買東西,看上了一個玩具,非常想買下來。但是這家商店有這樣一個規定,如果要買一件物品A,可能必須要另一件物品B。而要買物品B,可能必須要買另一件物品C。直到買的這件物品不需要買其他物品為止。 經過顧客抗議,商店重新決定如果買一件物品,所需要買其他物品超過一件的話,可以買其中任一件就好。小明錢不多了,他想知道如果要買這件物品,最少要花多少錢。
輸入第一行包含一個整數T(T <= 100).表示測試數據組數。
每組數據第一行包含三個整數N,M,P(1 <= P <= N <= 1000,0 <= m <= 10000),
分別表示商店物品總個數,物品之間關系數量,小明想買物品的編號。
接下來的一行包含N個整數Vi,表示第i個物品的價錢。
接下來的M行每行包含兩個整數a,b(1 <= a,b <= N),表示要買物品a就可能要買物品b。輸出輸出“Case #i: ans”(不含引號),i表示第i組數據,ans表示最少花的錢數。樣例輸入 2
4 4 1
1 3 2 4
1 2
2 3
2 4
3 4
4 4 2
2 1 3 4
1 2
2 4
1 3
3 4 樣例輸出 Case #1: 8
Case #2: 5 簡單樹型DP! AC碼: #include<iostream>
#include<cstdio>
#include<vector>
#include<cstring>
using namespace std;
#define MAX 1005
#define INF 9999999
vector<int> adj[MAX];
int dp[MAX],visit[MAX];
int weight[MAX];
int Min(int a,int b)
{return a>b?b:a;
}
void DFS(int u)
{if(visit[u])return;int len=adj[u].size(),v;if(len==0){dp[u]=weight[u];return;}for(int i=0;i<len;i++){v=adj[u][i];DFS(v);visit[v]=1;dp[u]=Min(dp[u],dp[v]+weight[u]);}
}
int main()
{int T,i,count=1;int n,m,p,a,b;scanf("%d",&T);while(T--){scanf("%d%d%d",&n,&m,&p);for(i=0;i<=n;i++)adj[i].clear();for(i=1;i<=n;i++)scanf("%d",&weight[i]);for(i=1;i<=m;i++){scanf("%d%d",&a,&b);adj[a].push_back(b);}memset(visit,0,sizeof(visit));for(i=0;i<=n;i++)dp[i]=INF;DFS(p);printf("Case #%d: %d\n",count++,dp[p]);}return 0;
}
總結
以上是生活随笔為你收集整理的NYOJ 679 贪婪的商店的全部內容,希望文章能夠幫你解決所遇到的問題。
如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。