题意:

给你一个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. binlog-do-db

    如果只是对一个数据库设置,其实没有效果的,其他数据还是会记录binlog的 binlog-ignore-db =database b  binlog日志里面将不会记录database b的所有相关的操 ...

  2. oracle 存储过程和包的权限

    GRANT CREATE ANY PROCEDURE TO MONKEY --創建,查看,替換的權限 GRANT EXECUTE ANY PROCEDURE TO MONKEY --執行和查看的權限 ...

  3. vagrant up报错【io.rb:32:in `encode': "\x95" followed by "\"" on GBK (Encoding::InvalidByteSequenceError)】

    vagrant up报错[io.rb:32:in `encode': "\x95" followed by """ on GBK (Encoding: ...

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

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

  5. Redis 实战 —— 05. Redis 其他命令简介

    发布与订阅 P52 Redis 实现了发布与订阅(publish/subscribe)模式,又称 pub/sub 模式(与设计模式中的观察者模式类似).订阅者负责订阅频道,发送者负责向频道发送二进制字 ...

  6. hello2 部分代码解析

    ResponseServlet.java源码文件 1 @WebServlet("/response") //以@WebServlet注释开头,注释指定相对于上下文根的URL模式, ...

  7. 阿里面试常问的redis数据结构,建议收藏

    关于Redis redis是一个开源的使用C语言编写的一个kv存储系统,是一个速度非常快的非关系远程内存数据库.它支持包括String.List.Set.Zset.hash五种数据结构.除此之外,通过 ...

  8. 在nodejs中创建child process

    目录 简介 child process 异步创建进程 同步创建进程 在nodejs中创建child process 简介 nodejs的main event loop是单线程的,nodejs本身也维护 ...

  9. 提取当前文件夹下的所有文件名.bat(Windows批处理文件)

    @echo off dir /s/b *.* > 文件名.txt exit

  10. 无法获取 vmci 驱动程序版本: 句柄无效。 驱动程序 vmci.sys 版本不正确。请尝试重新安装 VMware Workstation。 打开模块DevicePowerOn电源失败。

    1.别打开电源,然后到虚拟机安装文件夹内.2.找到你的虚拟机系统文件中后缀为vmx的文件,右击用记事本或者Notepad++打开.2.搜索找到vmci0.present='TRUE',字段,把true ...