题意:

给你一个n,然后给你一个n*n的正方形w[i][j],你需要找到一个从(1,1)点走到(n,n)点的最短路径数量。而且这个路径必须按照y=x对称

题解:

我们把左上角的点当作(0,0)点,右下角的点当作(n,n)点

因为路径必须按照y=x堆成,那么我们可以按照y=x这一条线对折,然后正方形就变成了三角形,我们把对折成三角形后两点在同一位置的值相加,比如(1,1)和(n,n)对折后在一个位置,那么我们就让w[1][1]+=w[n][n](这里我们保留左上部分)。

然后你按照左上部分从(0,0)点只要走到对称线y=x的点上,这就是一个从左上角到右下角的一条路径(可以想一想)

那么我们就可以对这个上半部分的三角形就行bfs式的最短路遍历

代码:

fill函数的作用是:将一个区间的元素都赋予val值。函数参数:fill(vec.begin(), vec.end(), val); val为将要替换的值。

  1 #include <cstdio>
2 #include <cstring>
3 #include <cctype>
4 #include<queue>
5 #include<vector>
6 #include <algorithm>
7 using namespace std;
8 const int maxn=105;
9 const int INF=1e9+10;
10 const int mod=1e9+9;
11 typedef long long LL;
12 int n,dp[maxn][maxn],w[maxn][maxn],counts[maxn][maxn];
13 //dp[x][y]求的是从(0,0)点到(x,y)点的最短路径值(也就是最短路)
14 //counts[x][y]求的是从(0,0)点到(x,y)点的最短路径数量
15 int p[4][2]=
16 {
17 {1,0},
18 {0,1},
19 {-1,0},
20 {0,-1}
21 };
22 struct shudui
23 {
24 int x,y,lx,ly,dis;
25 shudui() {}
26 shudui(int x,int y,int lx,int ly,int dis)
27 {
28 this->x=x;
29 this->y=y;
30 this->lx=lx;
31 this->ly=ly;
32 this->dis=dis;
33 }
34 bool operator < (const shudui a)const
35 {
36 return a.dis<dis;
37 }
38 } str1;
39 priority_queue<shudui>r;
40 void JK()
41 {
42 for(int i=0; i<maxn; ++i)
43 fill(dp[i],dp[i]+maxn,mod);
44 counts[0][0]=1;
45 r.push(shudui(0,0,0,0,w[0][0]));
46 while(!r.empty())
47 {
48 str1=r.top();
49 r.pop();
50 int x=str1.x;
51 int y=str1.y;
52 int lx=str1.lx;
53 int ly=str1.ly;
54 int dis=str1.dis;
55 if(dp[x][y]>dis)
56 {
57 dp[x][y]=dis;
58 counts[x][y]=counts[lx][ly];
59 }
60 else if(dp[x][y]==dis)
61 {
62 counts[x][y]=(counts[x][y]+counts[lx][ly])%mod;
63 continue;
64 }
65 else continue;
66
67 if(x+y>=n-1) continue;
68 for(int i=0; i<4; ++i)
69 {
70 int xx=x+p[i][0];
71 int yy=y+p[i][1];
72 if(xx<n && yy<n && xx>=0 && yy>=0)
73 {
74 r.push(shudui(xx,yy,x,y,dis+w[xx][yy]));
75 }
76 }
77 }
78 }
79 int main()
80 {
81 while(~scanf("%d",&n) && n)
82 {
83 for(int i=0; i<n; ++i)
84 {
85 for(int j=0; j<n; ++j)
86 {
87 scanf("%d",&w[i][j]);
88 }
89 }
90 for(int i = 0; i < n; i++)
91 {
92 for(int j = 0; j < n-i-1; j++)
93 {
94 w[i][j] += w[n-j-1][n-i-1];
95 }
96 }
97 JK();
98 int minn=mod;
99 for(int i=0; i<n; ++i)
100 {
101 minn=min(minn,dp[i][n-i-1]);
102 }
103 int ans=0;
104 for(int i=0; i<n; ++i)
105 {
106 if(dp[i][n-i-1]==minn)
107 {
108 ans=(ans+counts[i][n-i-1])%mod;
109 }
110 }
111 printf("%d\n",ans);
112 }
113 return 0;
114 }

UVA - 12295 最短路(迪杰斯特拉)——求按对称路线最短路条数的更多相关文章

  1. 最短路——迪杰斯特拉算法 HDU_3790

    初识最短路,今天只弄了一个迪杰斯特拉算法,而且还没弄成熟,只会最基本的O(n^2),想弄个优先队列都发现尼玛被坑爆了,那个不应该用迪杰斯特拉算法写 表示还是不会优化版的迪杰斯特拉算法,(使用优先队列) ...

  2. POJ 1062 昂贵的聘礼 (最短路 迪杰斯特拉 )

    题目链接 Description 年轻的探险家来到了一个印第安部落里.在那里他和酋长的女儿相爱了,于是便向酋长去求亲.酋长要他用10000个金币作为聘礼才答应把女儿嫁给他.探险家拿不出这么多金币,便请 ...

  3. HDU 2680 最短路 迪杰斯特拉算法 添加超级源点

    Choose the best route Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Ot ...

  4. HUD 2544 最短路 迪杰斯特拉算法

    最短路 Time Limit: 5000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total Submiss ...

  5. Dijkstra(迪杰斯特拉求最短路径)-02-网络延迟时间

    有 N 个网络节点,标记为 1 到 N. 给定一个列表 times,表示信号经过有向边的传递时间. times[i] = (u, v, w),其中 u 是源节点,v 是目标节点, w 是一个信号从源节 ...

  6. hdu 1595 find the longest of the shortest(迪杰斯特拉,减去一条边,求最大最短路)

    find the longest of the shortest Time Limit: 1000/5000 MS (Java/Others)    Memory Limit: 32768/32768 ...

  7. 51nod1459迷宫问题—(迪杰斯特拉)

    1459 迷宫游戏  基准时间限制:1 秒 空间限制:131072 KB 分值: 0 难度:基础题  收藏  关注 你来到一个迷宫前.该迷宫由若干个房间组成,每个房间都有一个得分,第一次进入这个房间, ...

  8. hdu 1874 畅通工程续(迪杰斯特拉优先队列,floyd,spfa)

    畅通工程续 Time Limit: 3000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Total Subm ...

  9. hdu 3339 In Action(迪杰斯特拉+01背包)

    In Action Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total S ...

随机推荐

  1. 2021新年 Vue3.0 + Element UI 尝鲜小记

    2021年,又是新的一年,Vue 已经发布 3.0 版本,最好用的 UI 组件库 Element UI 也发布了适配 Vue3.0 的新版本,是时候开始学习一下这两个新技术. 本文主要记录了使用 Vu ...

  2. netstat -an|awk '/^tcp/ {++s[$NF]} END {for( a in s) {print a,s[a]}}'

    监控tcp连接情况 netstat  -an|awk '/^tcp/ {++s[$NF]} END {for( a in s) {print  a,s[a]}}'

  3. 【Software Test】Basic Of ST

    文章目录 Learning Objective Introduction Software Applications Before Software Testing What is testing? ...

  4. UVA - 185 Roman Numerals

    题目链接: https://vjudge.net/problem/UVA-185 思路: 剪枝.回溯 注意回溯的时候,是从当前点的下一个开始,而不是从已经遍历的个数点开始!!不然回溯有问题! 思路参考 ...

  5. oracle编译表上失效USERDBY脚本

    对表进行DLL操作之后,依赖这个表的一些存储过程,触发器等会失效,可以用下边的脚本进行重编译 /* Formatted on 2020/7/8 上午 09:31:31 (QP5 v5.163.1008 ...

  6. day128:MySQL进阶:

    目录 1.介绍和安装 2.基础管理 2.1 用户管理 2.2 权限管理 2.3 连接管理 2.4 配置管理 3.MySQL的体系结构 4.SQL 5.索引和执行计划 1.介绍和安装 1.1 数据库分类 ...

  7. 在.NET Core 中使用Quartz.NET

    Quartz.NET是功能齐全的开源作业调度系统,可用于最小的应用程序到大型企业系统. Quartz.NET具有三个主要概念: job:运行的后台任务 trigger:控制后台任务运行的触发器. sc ...

  8. Scrapy——將數據保存到MySQL數據庫

    Scrapy--將數據保存到MySQL數據庫 1. 在MySQL中創建數據庫表job_inf: 1 Create table job_inf( 2 id int(11) not null auto_i ...

  9. python多线程和GIL全局解释器锁

    1.线程     线程被称为轻量级进程,是最小执行单元,系统调度的单位.线程切换需要的资源一般,效率一般.  2.多线程         在单个程序中同时运行多个线程完成不同的工作,称为多线程 3.并 ...

  10. Tensorflow-各种优化器总结与比较

    优化器总结 机器学习中,有很多优化方法来试图寻找模型的最优解.比如神经网络中可以采取最基本的梯度下降法. 梯度下降法(Gradient Descent) 梯度下降法是最基本的一类优化器,目前主要分为三 ...