题意:

给你一个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. Centos 6.5 Rabbitmq 安装和集群,镜像部署

    centos 6.5 rabbitmq 安装和集群,镜像部署 安装erlang: yum install gcc glibc-devel make ncurses-devel openssl-deve ...

  2. python模块详解 | psutil

    目录 psutil 简介 psutil的功能函数 cpu memory_内存 disk_磁盘 net_网络 pid_进程管理 sensors_传感器 其他(用户,启动时间) psutil简介 psut ...

  3. mysql中的基本注入函数

    1. 常见数据库注入函数: MYSQL: and length((user))>10 ACCESS: and (select count() from MSysAccessObject)> ...

  4. 最新详解android自动化无障碍服务accessibilityservice以及高版本问题_1_如何开启获得无障碍

    前言 无障碍服务accessibilityservice是什么 简单来说 无障碍服务就是一个为残障人士 尤其是视觉障碍人士提供的一个帮助服务.具体就是可以识别控件 文字 可以配合语音助手 操作和 使用 ...

  5. ctfhub技能树—彩蛋

    彩蛋题建议大家首先自己动手去找一找 做 好 准 备 后 再 看 下 文 !           1.首页 使用域名查询工具查询子域名 2.公众号 此题关注ctfhub公众号即可拿到,不过多赘述. 3. ...

  6. CodeMonkey少儿编程第2章 turnTo对象

    目标 了解对象的概念 了解方法与对象的关系 掌握turnTo指令的用法 在开始本章的学习之前,我们先来复习一下上一章的知识点. 在第1章中,我们学会了在这个游戏中最简单的两个指令. step x 其中 ...

  7. kafka项目经验之如何进行Kafka压力测试、如何计算Kafka分区数、如何确定Kaftka集群机器数量

    @ 目录 Kafka压测 Kafka Producer(生产)压力测试 Kafka Consumer(消费)压力测试 计算Kafka分区数 Kafka机器数量计算 Kafka压测 用Kafka官方自带 ...

  8. gin框架之路由前缀树初始化分析

    https://mp.weixin.qq.com/s/lLgeKMzT4Q938Ij0r75t8Q

  9. WPF Selector、SelectIndex、SelectedValue、SelectedValuePath、SelectedItem这几兄弟你分的清楚嘛?

    Selector Selector是一个抽象类,继承ItemsControl类(包含任何类型的对象(例如字符串,图像或面板)的集合),而本文的4个兄弟都是Selector类下的4个属性. Select ...

  10. js--数组的find()和findIndex()方法的使用介绍

    前言 阅读本文前先来思考一个问题,面对一个非空数组,你如何快速对数组进行遍历,如何快速找到数组中第一个我们需要关注的数据元素,并且如何知道该元素在数组中对应的下标索引,可能用for循环遍历,然后判断元 ...