题意:

给你一个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. SpringBoot对静态资源的映射规则

    在WebMvcAutoConfiguration类中有相对应的方法addResourceHandlers public void addResourceHandlers(ResourceHandler ...

  2. Linux tar压缩和解压

    经常会忘记 tar 压缩和解压命令的使用,故记下来. 1. 打包压缩 tar -zcvf pack.tar.gz pack/ #打包压缩为一个.gz格式的压缩包 tar -jcvf pack.tar. ...

  3. 【Oracle LISTNER】oracle Listener 宕机解决办法

    今天想起了很久没用的oracle库,用plsql尝试连接,发现报超时错误,以为是偶然,多次尝试连接,发现还是超时,于是登录到系统中,查看数据库情况,发现正常查询和修改添加,感觉不是数据库问题,查看监听 ...

  4. Cloudera Manager添加主机节点

    为了监控方便,想把研发环境中的主机节点都纳入Cloudera Manager的管理中,这样在遇到问题时可方便的查看主机的硬件资源情况. 添加主机节点有多种方式,由于我是离线工作,所以选择rpm包的方式 ...

  5. web测试误区:浏览器后退键退出系统会话失效

    通过最近测试的项目,认识到实际:浏览器后退键退出系统,会话仍旧有效.打破了之前认为浏览器后退键就会退出系统登录的认知. 一,了解Cookie和Session的作用,具体来说cookie机制采用的是在客 ...

  6. DNS基础概要

    dns服务系统由客户端和服务器组成,提供域名到ip地址的解析,或者提供ip地址到域名的逆向解析. 1.DNS域名空间 每个dns域名由分级的label构成,如www.sina.com.cn,由www. ...

  7. 【译】Async/Await(三)——Aysnc/Await模式

    原文标题:Async/Await 原文链接:https://os.phil-opp.com/async-await/#multitasking 公众号: Rust 碎碎念 翻译 by: Praying ...

  8. 1.搭建Hadoop实验平台

    节点功能规划 操作系统:CentOS7.2(1511) Java JDK版本:jdk-8u65-linux-x64.tar.gz Hadoop版本:hadoop-2.8.3.tar.gz 下载地址: ...

  9. 入门OJ:郭嘉的消息传递

    题目描述 我们的郭嘉大大在曹操这过得逍遥自在,但是有一天曹操给了他一个任务,在建邺城内有N(<=1000)个袁绍的奸细 将他们从1到N进行编号,同时他们之间存在一种传递关系,即若C[i,j]=1 ...

  10. Centos 7 网卡配置

    网卡配置位置 1 /etc/sysconfig/network-scripts/ifcfg-ethx  -----其中x为网卡名称,centos 默认网卡名称为ens33 如何配置  1 2 3 4 ...