uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&page=show_problem&problem=1858

题目大意:

Jimmy下班后决定每天沿着一条不同的路径回家,欣赏不同的风景。他打算只沿着满足如下条件的(A,B)道路走:存在一条从B出发回家的路,比所有从A出发回家的路径都短。你的任务是计算一共有多少条不同的回家路径。其中公司的编号为1,家的编号为2.

思路:

题目给出的n于1000以内,所以我直接用了邻接矩阵了。

首先求出每个点回家的最短路径。dis[u](SPFA或者dijkstra都可以)

题目说的存在一条从B出发回家的路,比所有从A出发回家的路径都短,即dis[B]<dis[A],这样我们创建一个新的图,当dis[B]<dis[A]建立有向变A->B,然后用动态规划求解。

(没一个点要加上与他相连的所有边的次数)

#include<cstdio>
#include<cstring>
#include<queue>
#include<algorithm>
using namespace std;
const int INF=10000000;
const int MAXN=1024;
int dis[MAXN];
int n,m;
int map[MAXN][MAXN];
int cango[MAXN][MAXN];
int dp[MAXN];
void SPFA()
{
int start=2;
bool vis[MAXN]={0};
deque<int> q;
q.push_back(start);
dis[start]=0;
vis[start]=true;
while(!q.empty())
{
int cur=q.front();
q.pop_front();
vis[cur]=false; for(int i=1;i<=n;i++)
if(map[cur][i]+dis[cur] < dis[i])
{
dis[i]=map[cur][i]+dis[cur];
if(!vis[i])
{
vis[i]=true;
if(!q.empty() && dis[i] < dis[q.front()])
q.push_front(i);
else
q.push_back(i);
}
}
}
} int dfs(int cur)
{
if(dp[cur]!=-1)
return dp[cur]; int temp=0;
for(int i=1;i<=n;i++)
if(cango[cur][i])
{
temp+=dfs( i );
}
return dp[cur]=temp;
} int main()
{
while(~scanf("%d",&n),n)
{
for(int i=1;i<=n;i++)
{
dis[i]=INF;
dp[i]=-1;
for(int j=1;j<=n;j++)
{
map[i][j]=INF;
cango[i][j]=0;
}
} scanf("%d",&m);
for(int i=0;i<m;i++)
{
int from,to,dis;
scanf("%d%d%d",&from,&to,&dis);
map[from][to]=map[to][from]=dis;
}
SPFA(); for(int i=1;i<=n;i++)
for(int j=1;j<=n;j++)
if(dis[i] > dis[j] && map[i][j]!=INF) cango[i][j]=1; dp[2]=1;
dfs(1); printf("%d\n",dp[1]);
}
}

UVA 10917 Walk Through the Forest SPFA的更多相关文章

  1. UVA - 10917 - Walk Through the Forest(最短路+记忆化搜索)

    Problem    UVA - 10917 - Walk Through the Forest Time Limit: 3000 mSec Problem Description Jimmy exp ...

  2. UVA 10917 Walk Through the Forest(dijkstra+DAG上的dp)

    用新模板阿姨了一天,换成原来的一遍就ac了= = 题意很重要..最关键的一句话是说:若走A->B这条边,必然是d[B]<d[A],d[]数组保存的是各点到终点的最短路. 所以先做dij,由 ...

  3. uva 10917 Walk Through The Forest

    题意: 一个人从公司回家,他可以从A走到B如果从存在从B出发到家的一条路径的长度小于任何一条从A出发到家的路径的长度. 问这样的路径有多少条. 思路: 题意并不好理解,存在从B出发到家的一条路径的长度 ...

  4. UVa 10917 A Walk Through the Forest

    A Walk Through the Forest Time Limit:1000MS  Memory Limit:65536K Total Submit:48 Accepted:15 Descrip ...

  5. 训练指南 UVA - 10917(最短路Dijkstra + 基础DP)

    layout: post title: 训练指南 UVA - 10917(最短路Dijkstra + 基础DP) author: "luowentaoaa" catalog: tr ...

  6. A Walk Through the Forest[HDU1142]

    A Walk Through the Forest Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Jav ...

  7. 【uva10917】Walk Through the Forest (最短路)

    题目: gbn最近打算穿过一个森林,但是他比较傲娇,于是他决定只走一些特殊的道路,他打算只沿着满足如下条件的(A,B)道路走:存在一条从B出发回家的路,比所有从A出发回家的路径都短.你的任务是计算一共 ...

  8. HDU - 1142:A Walk Through the Forest (拓扑排序)

    Jimmy experiences a lot of stress at work these days, especially since his accident made working dif ...

  9. hduoj----1142A Walk Through the Forest(记忆化搜索+最短路)

    A Walk Through the Forest Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Jav ...

随机推荐

  1. jQuery11 data() : 数据缓存

    <!DOCTYPE HTML> <html> <head> <meta http-equiv="Content-Type" content ...

  2. Kinect 开发 —— 控制PPT播放

    实现Kinect控制幻灯片播放很简单,主要思路是:使用Kinect捕捉人体动作,然后根据识别出来的动作向系统发出点击向前,向后按键的事件,从而使得幻灯片能够切换. 这里的核心功能在于手势的识别,我们在 ...

  3. java种instanceof方法和getclass方法的区别

    在比较一个类是否和另一个类属于同一个类实例的时候,我们通常可以采用instanceof和getClass两种方法通过两者是否相等来判断,但是两者在判断上面是有差别的,下面写个测试类. public c ...

  4. 【hdu 6038】Function

    [Link]:http://codeforces.com/contest/834/problem/C [Description] 给你两个排列a和b; a排列的长度为n,b排列的长度为m; a∈[0. ...

  5. 【原创】k8s源代码分析-----EndpointController

    转自本人空间 http://user.qzone.qq.com/29185807/blog/1459325937 一.controller manager创建endpointController 代码 ...

  6. Qt 5.11的QChar、QString、QTextBoundaryFinder和双向文本算法现在完全兼容Unicode 10

    本文翻译自:Qt 5.11 released 原文作者: Qt公司CTO兼Qt开源项目维护官Lars Knoll翻译校审:Richard.Hongfei.Haipeng 5月22日,我们提发布了Qt ...

  7. PHP JSON的BUG

    将下面的数组进行 JSON 编码时出错,编码中丢掉了最后一维数组中的下标. Array ( [1] => Array ( [0] => Array ( [0] => Array ( ...

  8. 矩阵乘法java代码实现

    矩阵只有当左边矩阵的列数等于右边矩阵的行数时,它们才可以相乘, 乘积矩阵的行数等于左边矩阵的行数,乘积矩阵的列数等于右边矩阵的列数 即A矩阵m*n,B矩阵n*p,C矩阵m*p: package exa ...

  9. golang 函数作为类型

    golang 函数作为类型 package main import "fmt" type A func(int, int) func (f A)Serve() { fmt.Prin ...

  10. golang 函数传值

    package main import ( "fmt" ) type Vertex struct { X, Y int } func dop(a Vertex, vl int) { ...