hdu 1142 记忆化搜索
2014-01-02 19:38
435 查看
首先用迪杰斯特拉算法求出各点到2的最短距离,然后用记忆化搜索算出 各点到2的可能路径数dp[i]
AC代码如下:
AC代码如下:
#include <iostream> #include <cstring> #include <string> #include <algorithm> using namespace std; #define MAX 0x3f3f3f3f typedef struct{ int to, next, weight; }Edge; Edge edge[2000000]; int head[1010], tot; int N; int dis[1010], weight[1010][1010]; long long ans; bool visit[1010]; int dp[1010]; void calc_min_dis(){ memset( dis, 0x3f, sizeof( dis ) ); for( int i = head[2]; i != -1; i = edge[i].next ){ int to = edge[i].to; dis[to] = edge[i].weight; } bool mark[1010]; memset( mark, false, sizeof( mark ) ); mark[2] = true; for( int i = 1; i < N; i++ ){ int k = 1, mindis = MAX; for( int j = 1; j <= N; j++ ){ if( !mark[j] && dis[j] < mindis ){ mindis = dis[j]; k = j; } } mark[k] = true; for( int j = 1; j <= N; j++ ){ if( !mark[j] && weight[j][k] + dis[k] < dis[j] ){ dis[j] = weight[j][k] + dis[k]; } } } dis[2] = 0; } void add_edge( int a, int b, int weight ){ edge[tot].to = b; edge[tot].weight = weight; edge[tot].next = head[a]; head[a] = tot++; edge[tot].to = a; edge[tot].weight = weight; edge[tot].next = head[b]; head[b] = tot++; } int DFS( int pos ){ if( pos == 2 ){ return 1; } if( dp[pos] != -1 ){ return dp[pos]; } int ans = 0; for( int i = head[pos]; i != -1; i = edge[i].next ){ int to = edge[i].to; if( dis[to] < dis[pos] ){ ans += DFS( to ); } } return dp[pos] = ans; } int main(){ int M; while( cin >> N && N ){ cin >> M; tot = 0; memset( head, -1, sizeof( head ) ); memset( weight, 0x3f, sizeof( weight ) ); for( int i = 0; i < M; i++ ){ int temp1, temp2, temp3; cin >> temp1 >> temp2 >> temp3; weight[temp1][temp2] = weight[temp2][temp1] = temp3; add_edge( temp1, temp2, temp3 ); } calc_min_dis(); memset( dp, -1, sizeof( dp ) ); int ans = DFS( 1 ); cout << ans << endl; } return 0; }
相关文章推荐
- sicily 1561.PRIME
- windows系统下SVN服务器的搭建_2014年1月2日
- ndk 编译多平台so文件
- Redhat修改主机名及网络配置
- 选择排序--经典
- MySQL 添加列,修改列,删除列
- Activity生命周期总结
- 左旋字符串
- MySQL 添加列,修改列,删除列
- TheBrain_windows_7_0_4_5+crack 安装记录
- A Comparison of the OSI and TCP/IP Reference Models
- xunsearch 迅搜初探
- 分析kernel的initcall函数
- 用SSH连接SSH连接nitrous.io
- shoelace源代码分析,bochs调试 readkernel()函数
- 串匹配算法KMP详解
- bubbleSort
- Vector介绍
- UltraGrid单元格放多个图片
- BeautyEye主题使用中BETitlePane的标题栏图标按钮个性修改