| ||||||||||
| Online Judge | Problem Set | Authors | Online Contests | User | ||||||
|---|---|---|---|---|---|---|---|---|---|---|
| Web Board Home Page F.A.Qs Statistical Charts | Current Contest Past Contests Scheduled Contests Award Contest | |||||||||
DFS 0MS AC 注释详细#include <stdio.h>
struct Thing
{
short idx;//代替物品索引
int truecost;//找到代替物品之后的价格
};
struct Node
{
int worth;//此人持有物品的价格
short lv;//此人等级
short sum;//此人的替代品数量
struct Thing inside[102];//替代品数组
};
struct Node data[102] = {0};//数据
bool foot[102] = {0};//访问标记数组
int m,n;//最大差距 人数
int dfs(int tobuy,int lvmin,int lvmax)//要买的那件物品 当前交易过的人的最小等级和最大等级
{
if(0 == data[tobuy].sum)//如果没有替代品
return data[tobuy].worth;
int i,j,k;
int min = data[tobuy].worth;//首先认为不用替代品
int tempmin = min;
for(i =1;i<=data[tobuy].sum;i++)//对于这个人的没一件替代品
{
int temp1 = lvmin,temp2 = lvmax;//中间变量 便于回溯
if(lvmax == 10000)//如果是第一次 将最大最小等级初始化
temp1 = temp2 = lvmax = lvmin = data[tobuy].lv;
if(data[data[tobuy].inside[i].idx].lv<lvmin)//如果持有第i件替代品的主人等级小于当前最小等级 则更新
temp1 = data[data[tobuy].inside[i].idx].lv;
if(data[data[tobuy].inside[i].idx].lv>lvmax)//如果持有第i件替代品的主人等级大于当前最大等级 则更新
temp2 = data[data[tobuy].inside[i].idx].lv;
if(lvmax == 10000 || !foot[tobuy] && temp2-temp1<=m)//如果是第一次 或者 此人没有被交易并且更新后的等级查满足要求
{
foot[tobuy] = true;//标记为访问
//去买第i件替代品 返回他的最小价格
tempmin = data[tobuy].inside[i].truecost + dfs(data[tobuy].inside[i].idx,temp1,temp2);
foot[tobuy] = false;//回溯
if(tempmin < min)
{
min = tempmin;
}
}
}
return min;//返回买第tobuy件物品的最小价格
}
int main()
{
while(EOF != scanf("%d%d",&m,&n))
{
int i,j,k;
for(i = 1;i<=n;i++)
{
scanf("%d%d%d",&data[i].worth,&data[i].lv,&data[i].sum);
for(j = 1;j<=data[i].sum;j++)
{
scanf("%d%d",&data[i].inside[j].idx,&data[i].inside[j].truecost);
}
}
printf("%d\n",dfs(1,-10000,10000));
}
return 0;
}
Followed by: Post your reply here: |
All Rights Reserved 2003-2013 Ying Fuchen,Xu Pengcheng,Xie Di
Any problem, Please Contact Administrator