您的位置:首页 > 其它

poj 3635 Full Tank?

2011-03-17 10:44 274 查看
最近发现写程序就是策略的体现。

这题我看了一个头两个大,看了别人的解题报告,才知道是一种bfs dijkstra的结合体,给我一万个脑袋都想不出来,虽然那两种策略之前都略知一二,还是得不断做题。

#include<iostream>
#include<queue>
using namespace std;
#define N 1005
#define inf 100000000
struct node
{
int ver,fuel,cost;
};
struct cmp{
bool operator()(node a,node b){
return a.cost>b.cost;}
};
bool use
[105];
int dp
[105],p
;
struct edge
{
int ver,dist;
edge *next;
};
edge *gragh
;
priority_queue<node,vector<node>,cmp>q;
void add_edge(int u,int v,int d)
{
edge *ptr=new edge;
ptr->ver=v;
ptr->dist=d;
ptr->next=gragh[u];
gragh[u]=ptr;
return ;
}
int dijkstra(int s,int e,int cap)
{
int cost,fuel,u,v,d;
node a,temp;
a.ver=s;
a.fuel=a.cost=0;
while(!q.empty())
q.pop();
q.push(a);
while(!q.empty())
{
a=q.top();
q.pop();
u=a.ver,fuel=a.fuel,cost=a.cost;
use[u][fuel]=1;
if(u==e)
return cost;
if(fuel+1<=cap&&!use[u][fuel+1]&&
dp[u][fuel+1]>dp[u][fuel]+p[u])
{
dp[u][fuel+1]=dp[u][fuel]+p[u];
temp.ver=u,temp.fuel=fuel+1,temp.cost=dp[u][fuel+1];
q.push(temp);
}
for(edge *ptr=gragh[u];ptr;ptr=ptr->next)
{
v=ptr->ver,d=ptr->dist;
if(fuel>=d&&!use[v][fuel-d]&&dp[v][fuel-d]>cost)
{
dp[v][fuel-d]=cost;
temp.ver=v,temp.fuel=fuel-d,temp.cost=dp[v][fuel-d];
q.push(temp);
}
}
}
return -1;
}
int main()
{
int n,m,i,j,d,q,s,e,cap,k;
scanf("%d%d",&n,&m);
for(k=0;k<n;k++)
{
scanf("%d",p+k);
gragh[k]=NULL;
}
for(k=0;k<m;k++)
{
scanf("%d%d%d",&i,&j,&d);
add_edge(i,j,d);
add_edge(j,i,d);
}
scanf("%d",&q);
while(q--)
{
scanf("%d%d%d",∩,&s,&e);
memset(use,0,sizeof(use));
for(i=0;i<n;i++)
for(j=0;j<=100;j++)
dp[i][j]=inf;
dp[s][0]=0;
i=dijkstra(s,e,cap);
if(i==-1)
printf("impossible/n");
else
printf("%d/n",i);
}
return 0;
}


其实这题我一开始是用深搜的,果断TLE,贴一下那个代码

#include<iostream>
using namespace std;
#define N 1005
#define inf 1000000000
bool visited
;
int p
,best,mind
;
struct node
{
node *next;
int dist,v;
};
node *gragh
;
void add_edge(int u,int v,int d)
{
node *ptr=new node;
ptr->v=v;
ptr->dist=d;
ptr->next=gragh[u];
gragh[u]=ptr;
return ;
}
void init(int n,int m)
{
int i,u,v,d;
node *ptr;
for(i=0;i<n;i++)
scanf("%d",p+i);
for(i=0;i<n;i++)
gragh[i]=NULL;
for(i=0;i<m;i++)
{
scanf("%d%d%d",&u,&v,&d);
add_edge(u,v,d);
add_edge(v,u,d);
}
for(i=0;i<n;i++)
mind[i]=inf;
for(i=0;i<n;i++)
for(ptr=gragh[i];ptr;ptr=ptr->next)
if(ptr->dist<mind[i])
mind[i]=ptr->dist;
return ;
}
void dfs(int cap,int remain,int mon,int v,int end)
{
int i;
node *ptr;
visited[v]=1;
if(mon>=best)
return ;
if(v==end&&mon<best)
{
best=mon;
return ;
}
for(i=mind[v]-remain>0?mind[v]-remain:0;i<=cap;i++)
for(ptr=gragh[v];ptr;ptr=ptr->next)
if(!visited[ptr->v])
{
if(remain+i<ptr->dist)
continue;
dfs(cap,remain+i-ptr->dist,mon+p[v]*i,ptr->v,end);
visited[ptr->v]=0;
}
return ;
}
int main()
{
int n,m,q,s,t,c;
scanf("%d%d",&n,&m);
init(n,m);
scanf("%d",&q);
for(int i=0;i<q;i++)
{
scanf("%d%d%d",&c,&s,&t);
memset(visited,0,sizeof(visited));
best=inf;
dfs(c,0,0,s,t);
if(best==inf)
printf("impossible/n");
else
printf("%d/n",best);
}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: