| ||||||||||
| 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 | |||||||||
为什么我的超内存啊,我都用邻接表了,还不行啊#include<iostream>
using namespace std;
struct Nodes
{
int weight;
int dj;
};
Nodes node[100];//节点数组
int len;//节点个数
int w;//等级允许差距
int queue[100];//队列
int front=0,rear=0;
int min_cost=0x7fffffff;
//====邻接表========
struct Arcnode
{
int data;//边的权值
int adjvex;
Arcnode *next;
};
typedef struct node
{
Arcnode *first;
}nodes[100];
nodes bian;//边
//=====================
int result[100];//记录根节点的边的权值
int high;//访问过的最高等级
int low;//访问过的最低等级
int cost=0;//记录每次的花费
void dfs(int form)
{
Arcnode *p=new(Arcnode);
p=bian[form].first;//确定本次的起点
int k=cost;//记住原始的cost值
if(node[form].dj>high)high=node[form].dj;//更改访问过的等级
if(node[form].dj<low)low=node[form].dj;//更改访问过的最低等级
while(p)//只要有变继续递归
{
cost=k;//恢复原始值
if(node[p->adjvex].dj-high>=-w&&node[p->adjvex].dj-low<=w)//
{
cost+=p->data+node[p->adjvex].weight-node[form].weight;
if(min_cost>cost)min_cost=cost;//判断是否为最小值
dfs(p->adjvex);
}
p=p->next;
}
}
void BFS()
{
int j,k;
min_cost=node[0].weight;
Arcnode *p=new(Arcnode);
p=bian[0].first;
while(p)
{
if((node[p->adjvex].dj-node[0].dj>=-w)&&(node[p->adjvex].dj-node[0].dj<=w))
{
queue[rear]=p->adjvex;
result[rear++]=p->data;
}
p=p->next;
}
while(front!=rear)
{
j=queue[front];
k=cost=result[front++]+node[j].weight;
if(min_cost>cost)min_cost=cost;
p=new(Arcnode);
p=bian[j].first;
while(p)
{
cost=k;
if((node[p->adjvex].dj-high>=-w)&&(node[p->adjvex].dj-low<=w))
{
cost+=p->data+node[p->adjvex].weight-node[j].weight;
if(min_cost>cost)min_cost=cost;
dfs(p->adjvex);
}
p=p->next;
}
}
cout<<min_cost<<endl;
}
int main()
{
int i,j,k,t,u,v;
cin>>i>>j;//输入等级差距和节点个数
w=i;
len=j;
k=0;
Arcnode *p;
while(j--)
{
//输入金币数目和主人的等级,金币数目作为节点的权值
cin>>node[k].weight>>node[k].dj>>t;
//输入替代品的编号和优惠价格
while(t--)
{
p=new(Arcnode);
cin>>u>>v;
p->adjvex=u-1;
p->data=v;//优惠价格作为边的权值
p->next=bian[k].first;
bian[k].first=p;
}
k++;
}
high=low=node[0].dj;//原始等级
BFS();//找最少的金币数目。
system("pause");
return 0;
}
Followed by:
Post your reply here: |
All Rights Reserved 2003-2013 Ying Fuchen,Xu Pengcheng,Xie Di
Any problem, Please Contact Administrator