HDU 1142 A Walk Through the Forest
题意 :
英语不好要遭殃。。。
给你一个图,找最短路。但是有个非一般的的条件:如果a,b之间有路,且你选择要走这条路,那么必须保证a到终点的所有路都小于b到终点的一条路。问满足这样的路径条数 有多少。。。就这个条件,看懂的时候估计都个把小时了
简化一下 a b之间如果有路 就是 1 -> 2 大于 2 -> i
解题思路:
1.1为起点,2为终点,因为要走ab路时,必须保证那个条件,所以从终点开始使用单源最短路Dijkstra算法,就得到了最短的一条路,作为找路的最低限度。
2.然后深搜每条路,看看满足题意的路径有多少条。当然,这个需要从起点开始搜,因为dis[i]数组中保存的都是该点到终点的最短距离。
3.这样搜索之后,dp[1]就是从起点到终点所有满足题意的路径的条数。
#include<bits/stdc++.h> using namespace std; const int maxn = 1010; const int INF = 0x3f3f3f3f; int n,m; bool vis[maxn]; int dp[maxn];//记录方案数 int mp[maxn][maxn]; int d[maxn]; void init() { memset(vis,0,sizeof(vis)); memset(dp,-1,sizeof(dp)); for(int i=1;i<=n;i++) for(int j=1;j<=n;j++) mp[i][j] = INF; } void dijkstral(int st) { for(int i=1;i<=n;i++) d[i] = mp[st][i]; d[st] = 0,vis[st]=1; for(int i=1;i<=n;i++) { int t=INF,k=-1; for(int j=1;j<=n;j++) { if(!vis[j] && d[j]< t) { t = d[j]; k = j; } } if(t == INF) break; vis[k] = 1; for(int j=1;j<=n;j++) { if(!vis[j] && d[j] > d[k]+mp[k][j]) d[j] = d[k] + mp[k][j]; } } } int dfs(int st) { int sum =0; if(dp[st] != -1) return dp[st]; if(st == 2) return 1; for(int i=1;i<=n;i++) { if(mp[st][i] != INF && d[st] > d[i]) sum += dfs(i); } return dp[st] = sum; } int main() { while (~scanf("%d",&n) && n) { scanf("%d",&m); init(); for(int i=1;i<=m;i++) { int x,y,v; scanf("%d %d %d",&x,&y,&v); mp[x][y] = mp[y][x] = v; } dijkstral(2); //for(int i=1;i<=n;i++) //printf("%d ",d[i]); //cout<<endl; printf("%d\n",dfs(1)); } }
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】凌霞软件回馈社区,博客园 & 1Panel & Halo 联合会员上线
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 智能桌面机器人:用.NET IoT库控制舵机并多方法播放表情
· Linux glibc自带哈希表的用例及性能测试
· 深入理解 Mybatis 分库分表执行原理
· 如何打造一个高并发系统?
· .NET Core GC压缩(compact_phase)底层原理浅谈
· 新年开篇:在本地部署DeepSeek大模型实现联网增强的AI应用
· DeepSeek火爆全网,官网宕机?本地部署一个随便玩「LLM探索」
· Janus Pro:DeepSeek 开源革新,多模态 AI 的未来
· 上周热点回顾(1.20-1.26)
· 【译】.NET 升级助手现在支持升级到集中式包管理