poj 1724

来源:互联网 发布:centos png 编辑:程序博客网 时间:2024/06/05 17:49
这是一题简单的搜索问题 , 可我就是w+t了10多次 。

一开始用的是vector来存储图(因为有重边) , 结果一直超时还加了优化 , 用邻接表之后 , 不加优化还过来 , 诶 , 直接代码, 以后凡是图都用邻接表存储吧 。

优化:  可以求出终点到其他点的最短距离 和 最少花费 , 这个可以把图反过来求 。
优化之后只要 98ms , 好像有个astar算法 , 可以0ms过 , 不知道是什么原理 。

代码:

#include
#include
#include
#include
#include
using namespace std;

const int MAXN = 110;
const int INF = 0x3f3f3f3f;
struct node
{
    int u , d ,c , pre;
}edge[10010];
struct node2
{
    int u , d ,c , pre;
}grap[10010];
int pre[MAXN] , c[MAXN] , d[MAXN] , xy[MAXN];
int n , m , k , vis[MAXN];
int minsum , cost , sum ;

void init()
{
    memset(pre ,-1,  sizeof(pre));
    memset(vis ,0 , sizeof(vis));
    memset(xy ,-1, sizeof(xy));
    cost = sum =0;
    minsum =INF;
}

void dfs(int u)
{
    if(sum >=minsum || cost > k)  return ;
    if(u ==n)
    {
       minsum =sum;
       return;
    }
    for(int i =pre[u] ; i != -1 ; i = edge[i].pre)
    {
      if(!vis[edge[i].u])
       {
         vis[edge[i].u] = 1;
          sum +=edge[i].d ;
          cost +=edge[i].c;
         dfs(edge[i].u);
          sum -=edge[i].d;
          cost -=edge[i].c;
         vis[edge[i].u] = 0;
       }
    }
}

void ford1()
{
   queueq;
    memset(vis ,0 , sizeof(vis));
    int i;
    for(i = 1; i<= n; i++)  d[i] = INF;
    d[n] =0;
   q.push(n);
   while(!q.empty())
    {
       int u =q.front(); q.pop();
       vis[u] =0;
       for(i =xy[u] ; i != -1 ; i = grap[i].pre)
       {
         if(d[grap[i].u] > d[u] + grap[i].d)
          {
             d[grap[i].u]= d[u] + grap[i].d ;
            if(!vis[grap[i].u])  {q.push(grap[i].u) ;vis[grap[i].u] = 1;}
          }
       }
    }
}

void ford2()
{
   queueq;
    memset(vis ,0 , sizeof(vis));
    int i;
    for(i = 1; i<= n; i++)  c[i] = INF;
    c[n] =0;
   q.push(n);
   while(!q.empty())
    {
       int u =q.front(); q.pop();
       vis[u] =0;
       for(i =xy[u] ; i != -1 ; i = grap[i].pre)
       {
         if(c[grap[i].u] > c[u] + grap[i].c)
          {
             c[grap[i].u]= c[u] + grap[i].c ;
            if(!vis[grap[i].u])  {q.push(grap[i].u) ;vis[grap[i].u] = 1;}
          }
       }
    }
}

int main()
{
   while(scanf("%d %d %d" , &k , &n , &m) != EOF)
    {
      init();
       int i , x ,y , z , t;
       for(i = 0 ;i < m; i++)
       {
          scanf("%d %d%d %d" , &x , &y , &z , &t);
          edge[i].u =y , edge[i].d = z , edge[i].c = t;
          edge[i].pre= pre[x];
          pre[x] =i;
          grap[i].u =x , grap[i].d = z,  grap[i].c = t;
          grap[i].pre= xy[y];
          xy[y] =i;
       }
      ford1();
      ford2();
       memset(vis ,0 , sizeof(vis));
       vis[1] =1;
      dfs(1);
       if(minsum ==INF)  printf("-1\n");
       elseprintf("%d\n" , minsum);
    }
    return0;
}
0 0
原创粉丝点击