poj3635---BFS

原创 2012年03月28日 16:21:23

求最短路。搜索题一般难在如何剪枝和判重上,如果这两个都解决的话,搜索题就变成水题。

这道题求的是从起始点到终点的最小花费,如果每次都把0~cap的油量都预先存储的话,必定会有很多不必要的操作,会很耗时。

如果每次在一个位置只加1V油量,那么就会节省大量的时间开销。

#include<queue>
#include<vector>
#include<cstdio>
#include<cstring>
#include<iostream>
#include<algorithm>
using namespace std;
#define maxn 1005
#define inf 1<<30
int sum[maxn],dis[maxn];
int cost[maxn],mincost[maxn][105];
bool vis[maxn][105];
int tot,n,m,t,st,en,qth,cap;
struct TNode
{
    int to,next,cost,cap;
    bool operator<(const TNode &temp) const
    {
        return cost>temp.cost;
    }
};
vector<TNode>ans;
priority_queue<TNode>qu;
void addedge(int u,int v,int w)
{
    TNode tmp;
    tmp.to=u,tmp.cost=w;
    tmp.next=sum[v],sum[v]=tot++;
    ans.push_back(tmp);
}
int bfs()
{
    int k;
    TNode tmp1,tmp2;
    while(!qu.empty()) qu.pop();
    memset(vis,0,sizeof(vis));
    tmp1.to=st,tmp1.cap=0,tmp1.cost=0;
    qu.push(tmp1);
    while(!qu.empty())
    {
        tmp1=qu.top(),qu.pop();
        if(tmp1.to==en) return tmp1.cost;
        if(vis[tmp1.to][tmp1.cap]) continue;
        vis[tmp1.to][tmp1.cap]=1;
        tmp2.to=tmp1.to,tmp2.cap=tmp1.cap+1,tmp2.cost=tmp1.cost+cost[tmp1.to];
        if(tmp2.cap<=cap&&!vis[tmp2.to][tmp2.cap]&&mincost[tmp2.to][tmp2.cap]>tmp2.cost)
        {
            mincost[tmp2.to][tmp2.cap]=tmp2.cost;
            qu.push(tmp2);
        }
        for(k=sum[tmp1.to];k!=-1;k=ans[k].next)
        {
            if(tmp1.cap<ans[k].cost) continue;
            tmp2.to=ans[k].to;
            tmp2.cap=tmp1.cap-ans[k].cost;
            tmp2.cost=tmp1.cost;
            if(!vis[tmp2.to][tmp2.cap]&&mincost[tmp2.to][tmp2.cap]>tmp2.cost)
            {
                mincost[tmp2.to][tmp2.cap]=tmp2.cost;
                qu.push(tmp2);
            }
        }
    }
    return -1;
}
int main()
{
    int i,u,v,w,j;
    while(scanf("%d%d",&n,&m)!=EOF)
    {
        tot=0;
        memset(sum,-1,sizeof(sum));
        for(i=0; i<n; i++) scanf("%d",&cost[i]);
        ans.clear();
        for(i=0; i<m; i++)
        {
            scanf("%d%d%d",&u,&v,&w);
            addedge(u,v,w);
            addedge(v,u,w);
        }
        scanf("%d",&qth);
        while(qth--)
        {
            scanf("%d%d%d",&cap,&st,&en);
            for(i=0;i<n;i++) for(j=0;j<=cap;j++) mincost[i][j]=inf;
            w=bfs();
            if(w==-1) puts("impossible");
            else printf("%d\n",w);
        }
    }
    return 0;
}

版权声明:本文为博主原创文章,未经博主允许不得转载。

相关文章推荐

poj3635 Full Tank? (bfs+heap)

题意: n个城市m条路,给出每个城市的油价,每组询问给出油箱容量,起点和终点,针对每组询问输出从起点到终点的最小花费。 做法: 最短路所以肯定是bfs。cost[i][j]表示到第i个城市,剩余...

POJ 3635 优先队列BFS

(感谢lyd学长的幻灯片) 注意vis数组的应用 在vis[i][j]中 i表示到了第i个点 j表示还剩j升油 vis[i][j]表示最小话费。 这样只需搜到话费比它少的更新入堆就...

POJ3026-Borg Maze【BFS+Prim】

  • 2011-07-30 18:36
  • 12KB
  • 下载

poj3635 Full Tank? 最短路+dp

思路:根据题意很容易想到动态规划方程,,状态dp[i][j]表示到达i时油量剩余j,但是复杂度太高。 从另一个角度想,由一个最优解产生另一个最优解,每次取最优解的节点进行扩展,类似dijkstra最短...

poj 3635(full tank?)

我感觉是dp类型的吧。。。。 discuss里一个讲解把状态的设置说的很好 设一个 money[1001][101] 表示 到点i时, 油量为j 的最小花费; 然后用dijstra的广搜变种来...

POJ3635-搜索,优先队列

/* 算法是搜索+优先队列没错,搜索也好确定,搜索方向就不好想了, 第一次搜索,我也不知道超了多少时间。。。 void solve() { for (int i=0; i<n; i++) ...

POJ 3635 Full Tank? 最短路DP

给出一个图(1≤n≤1000,0≤m≤100001\leq n\leq 1000,0\leq m\leq 10000),每个点有加油站费用cic_i,对于每个询问,油箱容积cc的车从ss到ee的最小费...

poj 3635 (最短路,广搜,邻接表,dp)

题意 : n个城市,每个城市的油价不同,m条连通这些城市之间的路,提供油桶的容量,要你求出由城市s出发到城市e的最小费用,其中刚开始时油桶为空,一单位的油可以走以单位的长度。 看...

poj3635

【题意】 给定n(n 【输入】 第一行两个数字n、m 接下来一行n个数字表示每个加油站的单位油价 接下来m行每行三个数字u、v、d描述一条边 接下来一行一个数q表示询问数 之后q行每行描...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:深度学习:神经网络中的前向传播和反向传播算法推导
举报原因:
原因补充:

(最多只允许输入30个字)