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;
解法:首先要理解题意 , “存在一条从 v 回家的路 , 比所有从 u 回家的路都要短” 意思就是说从 v 回家的路 , 要比从 u回家的最短路径 还要短 , 那么, 我们就能利用这个关系建图 , 首先求出每个回家的最短路径 , 然后再从办公室的位置出发 ,判断哪些路径是满足条件的 。 现在我们就等于是要在这个图上求出 , 从办公室到家总共有多少不同的路径 , 并且我们建的这个图 ,肯定是一个DAG图 , 那就可以用记忆化搜索。
代码:
#include
#include
#include
#include
using namespace std;
#define maxn 1010
#define INF 0xffffff
struct edge
{
}e;
vectorgrap[maxn];
int dist[maxn] , pre[maxn] , num[maxn];
int n , m;
int path[maxn];
int d[maxn];
void init()
{
}
bool SPFA()
{
}
void dfs(int u)
{