您的位置:首页 > 其它

poj 1062 昂贵的聘礼

2012-03-24 11:43 387 查看
http://poj.org/problem?id=1062

#include<iostream>
#include<stdio.h>
#include<algorithm>
#include<math.h>
#include<string.h>

using namespace std;
struct next
{
int instead;
int j;
struct next *next;
};
struct head
{
struct next *next;
int need;
int L;
}mem[101];
void build(int i,int j,int instead)
{
struct next *f=new next;
f->j=j;
f->instead=instead;
f->next=mem[i].next;
mem[i].next=f;
}
int m,ans;
//bool hadinstead[101];
void find(int i,int need,int big,int small)
{
//cout<<i<<endl;
if(i==1)
{
if(need<ans)
ans=need;
return ;
}
struct next *f;
f=mem[i].next;
while(f!=NULL)
{
int I=max(big,mem[f->j].L);
int J=min(small,mem[f->j].L);
if(I-J<=m&&need+f->instead<mem[f->j].need)
{
//cout<<(f->j)<<I<<" "<<J<<endl;
find(f->j,need+f->instead,I,J);
}
f=f->next;
}
}
void free(int n)
{
struct next *f;
for(int i=1;i<=n;i++)
{
while(mem[i].next!=NULL)
{
f=mem[i].next;
mem[i].next=mem[i].next->next;
delete(f);
}
}
}
int main()
{
//freopen("date.txt" ,"r",stdin);
int n,k;
int i,j,instead;
scanf("%d%d",&m,&n);
//memset(hadinstead,true,sizeof(hadinstead));
for(i=1;i<=n;i++)
{
scanf("%d%d%d",&mem[i].need,&mem[i].L,&k);
//if(k==0)
//hadinstead[i]=false;
while(k--)
{
scanf("%d%d",&j,&instead);
build(j,i,instead);
}
}
ans=mem[1].need;
for(i=2;i<=n;i++)
{

//if(!hadinstead[i])
find(i,mem[i].need,max(mem[i].L,mem[1].L),min(mem[i].L,mem[1].L));
}
printf("%d\n",ans);
free(n);
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: