poj 2662  最短路算法的扩展应用

来源:互联网 发布:淘宝运送方式怎么设置 编辑:程序博客网 时间:2024/05/20 13:15
题意:一个人要从办公室回到家里 , 问总共有多少条路 , 每个路(u, v)都要满足:存在一条从 v 回家的路 , 比所有从 u回家的路都要短?

解法:首先要理解题意 , “存在一条从 v 回家的路 , 比所有从 u 回家的路都要短” 意思就是说从 v 回家的路 , 要比从 u回家的最短路径 还要短 , 那么, 我们就能利用这个关系建图 , 首先求出每个回家的最短路径 , 然后再从办公室的位置出发 ,判断哪些路径是满足条件的 。 现在我们就等于是要在这个图上求出 , 从办公室到家总共有多少不同的路径 , 并且我们建的这个图 ,肯定是一个DAG图 , 那就可以用记忆化搜索。

代码:

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


#define maxn 1010
#define INF 0xffffff
struct edge
{
    int u;
    int d;
}e;
vectorgrap[maxn];
int dist[maxn] , pre[maxn] , num[maxn];
int n , m;
int path[maxn];
int d[maxn];

void init()
{
    for(int i =0; i <= n; i++)
      grap[i].clear();
    memset(d , 0, sizeof(d));
   
}

bool SPFA()
{
   queueq;
   q.push(2);

    int i;

    for(i = 1; i<= n; i++)  dist[i] = INF;
    dist[2] =0;
    memset(pre ,0 , sizeof(pre));
    memset(num ,0 , sizeof(num));
    memset(path, -1 , sizeof(path));  //标记源点到达目标点的最短路径

   while(!q.empty())
    {
       int u =q.front(); q.pop();
       pre[u] =0;

       for(i = 0; i< grap[u].size(); i++)
       {
          e =grap[u][i];
          if(dist[e.u]> dist[u]+e.d)
          {
             dist[e.u] =dist[u]+e.d;
             path[e.u] =u;
            if(!pre[e.u])
             {
               if(++num[e.u] > n)  returnfalse;
                pre[e.u] =1;
               q.push(e.u);
             }
          }
       }
    }

    returnfalse;
}

void dfs(int u)
{
    int i;
   if(d[u])  return ;
    if(u ==2)
    {
       d[u] +=1;
       return;
    }
    for(i = 0; i< grap[u].size(); i++)
    {
       int v =grap[u][i].u;
       if(dist[u]> dist[v])
       {
         dfs(v);
          d[u] +=d[v];
         
       }
    }
}

int main()
{
   while(scanf("%d" , &n)&& n)
    {
      init();
       scanf("%d" ,&m);
       int i ,j , x, y , z;
       for(i = 1; i<= m; i++)
       {
          scanf("%d %d%d" , &x , &y ,&z);
          e.u = y ,e.d = z;
         grap[x].push_back(e);
          e.u =x;
         grap[y].push_back(e);
       }

      SPFA();

      dfs(1);

      cout<<d[1]<<endl;
    }
    return0;
}
0 0
原创粉丝点击