UVA-10917 Walk Through the Forest (dijkstra+DP)
题目大意:n个点,m条边的无向图。一个人从起点到终点按照下面的走法:从A走向B当A到终点的最小距离比B到终点的最小距离大时。问从起点到终点有多少路径方案。
题目分析:先用dijkstra预处理出终点到每个点的最短路,然后将满足行走条件的A、B(除行走条件外,还要满足一个前提,即A、B之间要有边)用一条有向边连起来(A->B),得到一个DAG,动态规划解决。
代码如下:
# include<iostream>
# include<cstdio>
# include<vector>
# include<queue>
# include<cstring>
# include<algorithm>
using namespace std;
# define LL long long const LL INF=0x7fffffffffffffff;
struct Node
{
int u;
LL d;
Node(int _u,LL _d):u(_u),d(_d){}
bool operator < (const Node &a) const {
return d>a.d;
}
};
struct Edge
{
int to,nxt,w;
};
Edge e[200005];
int head[1005],n,cnt,vis[1005],dp[1005],mp[1005][1005];
LL dist[1005];
vector<int>G[1005]; void add(int u,int v,int w)
{
e[cnt].to=v;
e[cnt].w=w;
e[cnt].nxt=head[u];
head[u]=cnt++;
} void dijkstra(int S)
{
memset(vis,0,sizeof(vis));
fill(dist,dist+n+1,INF);
dist[S]=0;
priority_queue<Node>q;
q.push(Node(S,0));
while(!q.empty())
{
Node u=q.top();
q.pop();
if(vis[u.u]) continue;
vis[u.u]=1;
for(int i=head[u.u];i!=-1;i=e[i].nxt){
int v=e[i].to;
if(dist[v]>u.d+e[i].w){
dist[v]=u.d+e[i].w;
if(!vis[v])
q.push(Node(v,dist[v]));
}
}
}
} int DP(int u)
{
if(dp[u]!=-1) return dp[u];
if(u==2)
return dp[u]=1;
int sum=0;
for(int i=0;i<G[u].size();++i)
sum+=DP(G[u][i]);
return dp[u]=sum;
} int main()
{
int a,b,c,m;
while(scanf("%d",&n)&&n)
{
cnt=0;
memset(head,-1,sizeof(head));
memset(mp,0,sizeof(mp));
scanf("%d",&m);
while(m--)
{
scanf("%d%d%d",&a,&b,&c);
add(a,b,c);
add(b,a,c);
mp[a][b]=mp[b][a]=1;
} dijkstra(2); for(int i=0;i<=n;++i) G[i].clear();
for(int i=1;i<=n;++i){
for(int j=i+1;j<=n;++j){
if(!mp[i][j]) continue;
if(dist[i]>dist[j])
G[i].push_back(j);
if(dist[i]<dist[j])
G[j].push_back(i);
}
}
memset(dp,-1,sizeof(dp));
printf("%d\n",DP(1));
}
return 0;
}
UVA-10917 Walk Through the Forest (dijkstra+DP)的更多相关文章
- UVA 10917 Walk Through the Forest(dijkstra+DAG上的dp)
用新模板阿姨了一天,换成原来的一遍就ac了= = 题意很重要..最关键的一句话是说:若走A->B这条边,必然是d[B]<d[A],d[]数组保存的是各点到终点的最短路. 所以先做dij,由 ...
- UVA - 10917 - Walk Through the Forest(最短路+记忆化搜索)
Problem UVA - 10917 - Walk Through the Forest Time Limit: 3000 mSec Problem Description Jimmy exp ...
- HDU1142 A Walk Through the Forest(dijkstra)
A Walk Through the Forest Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Jav ...
- UVA 10917 Walk Through the Forest SPFA
uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&page=show_problem&problem= ...
- 【uva10917】Walk Through the Forest (最短路)
题目: gbn最近打算穿过一个森林,但是他比较傲娇,于是他决定只走一些特殊的道路,他打算只沿着满足如下条件的(A,B)道路走:存在一条从B出发回家的路,比所有从A出发回家的路径都短.你的任务是计算一共 ...
- HDU - 1142:A Walk Through the Forest (拓扑排序)
Jimmy experiences a lot of stress at work these days, especially since his accident made working dif ...
- 【BZOJ 1003】[ZJOI2006]物流运输(Dijkstra+DP)
题链 http://www.lydsy.com/JudgeOnline/problem.php?id=1003 Description 物流公司要把一批货物从码头A运到码头B.由于货物量比较大,需要n ...
- UVa 12186 工人的请愿书(树形DP)
https://vjudge.net/problem/UVA-12186 题意: 一个老板和n个员工组成树状结构,每个员工都有自己的唯一上司,老板的编号为0,员工1~n,工人们打算签署一个志愿书给老板 ...
- UVA 1213 Sum of Different Primes(经典dp)
题意:选择k(k<15)个唯一质数,求出和为n(n<1121)的可能数 题解:预处理dp,dp[k][n]表示使用k个素数拼成n的总方案数 就是三重枚举,枚举k,枚举n,枚举小于n的素数 ...
随机推荐
- 带你走进AJAX(1)
ajax是什么? (1)ajax (asynchronouse javascript and xml) 异步的javascript 和xml (2)ajax是一个粘合剂,将javascript.xml ...
- 20145103《JAVA程序设计》第十周学习总结
网络编程 网络编程就是在两个或两个以上的设备(例如计算机)之间传输数据.程序员所作的事情就是把数据发送到指定的位置,或者接收到指定的数据,这个就是狭义的网络编程范畴.在发送和接收数据时,大部分的程序设 ...
- 20145216史婧瑶《Java程序设计》第一次实验报告
实验一 Java开发环境的熟悉(Linux + Eclipse) 实验内容 1.使用JDK编译.运行简单的Java程序: 2.使用Eclipse 编辑.编译.运行.调试Java程序. 实验要求 1.没 ...
- 20145312 《Java程序设计》第九周学习总结
20145312 <Java程序设计>第九周学习总结 学习笔记 Chapter 16整合数据库 16.1 JDBC入门 16.1.1 JDBC简介 SUN公司为了简化.统一对数据库的操作, ...
- 20145331《Java程序设计》第1周学习总结
20145331<Java程序设计>第1周学习总结 教材学习内容总结 第一章 1.java的三大平台分别为java SE.java EE.java ME,其中java SE是基础. 2.j ...
- 扒开系统调用的三层皮(下)/给MenuOS增加time和time-asm命令
上周从用户态的角度去理解系统调用 这周通过内核的方式 调试和跟踪系统调用来理解 rm menu -rf 强制删除原menu文件 git clone https://github.com/mengni ...
- 【前端】Vue.js实现简单价格计算器
价格计算器 实现效果: 实现代码及注释: <!DOCTYPE html> <html> <head> <title>价格计算器</title> ...
- asm-3.3.1.jar详解 (转)
Java字节码操纵框架.它可以直接以二进制形式动态地生成stub类或其他代理类,或者在装载时动态地修改类.ASM提供类似于BCEL和SERP之类的工具包的功能,但是被设计得更小巧.更快速,这使它适用于 ...
- Matlab绘图基础——colormap在数字图像处理及三维图形展示上的应用(分层设色)
色图(color map)是MATLAB系统引入的概念.在MATLAB中,每个图形窗口只能有一个色图. 色图是m×3 的数值矩阵,它的每一行是RGB三元组.色图矩阵可以人为地生成 ...
- 监控控制台是否运行的bat
@echo offrem set secs=5set srvname="TRS.Export.Scheduler.exe" echo.echo ================== ...