洛谷 2243Dijkstra
Posted E-Valley
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了洛谷 2243Dijkstra相关的知识,希望对你有一定的参考价值。
一、题意:
电路板的整体结构是一个 R 行 C 列的网格,每个格点都是电线的接点,每 个格子都包含一个电子元件。电子元件的主要部分是一个可旋转的、连接一条对 角线上的两个接点的短电缆。在旋转之后,它就可以连接另一条对角线的两个接 点。电路板左上角的接点接入直流电源,右下角的接点接入飞行车的发动装置。
Ha\'nyu 发现由于某些元件的方向不小心发生了改变,电路板可能处于断路的 状态。她准备通过计算,旋转最少数量的元件,使电源与发动装置通过若干条短 缆相连。
二、输入及输出格式
输入格式:
输入文件包含多组测试数据。第一行包含一个整数T 表示测试数据的数目。
对于每组测试数据,第一行包含正整数 R 和C,表示电路板的行数和列数。
之后 R 行,每行C 个字符,字符是"/"和"\\"中的一个,表示标准件的方向。
对于40% 的数据,R,C≤5。
对于 100% 的数据,R,C≤500,T≤5。
输出格式:
对于每组测试数据,在单独的一行输出一个正整数,表示所需的缩小旋转次数。
如果无论怎样都不能使得电源和发动机之间连通,输出 NO SOLUTION。
输入输出样例
输入样例#1:1
3 5
\\\\/\\\\
\\\\///
/\\\\\\\\输出样例#1:
1
三、思路及说明
说明
样例的输入对应于题目描述中的情况。
只需要按照下面的方式旋转标准件,就可以使得电源和发动机之间连通。
思路
https://www.luogu.org/wiki/show?name=%E9%A2%98%E8%A7%A3+P2243
注意:别忘了初始化!!!!!!还有数组的大小问题!!!!!!!
四、代码
1 #include <cstdio> 2 #include <queue> 3 4 const int MAXN = 550 * 5; 5 6 int t, r, c; 7 8 struct Edge; 9 struct Node { 10 Edge *last; 11 bool flag; 12 int dist; 13 Node () : dist(0x7fffffff) {} 14 } node[MAXN]; 15 16 struct Edge { 17 Node *from, *to; 18 int pow; 19 Edge *next; 20 Edge (Node *from, Node *to, int pow) : from(from), to(to), pow(pow), next(from->last) {} 21 }; 22 23 void addE(int x, int y, int z) { 24 node[x].last = new Edge (node + x, node + y, z); 25 node[y].last = new Edge (node + y, node + x, z); 26 } 27 28 void Dij(int s) { 29 std::priority_queue< std::pair<int, Node *>, std::vector< std::pair<int, Node *> >, std::greater< std::pair<int, Node *> > > q; 30 node[s].dist = 0; 31 node[s].flag = 1; 32 q.push(std::make_pair(0, node + s)); 33 34 while (!q.empty()) { 35 std::pair<int, Node *> p = q.top(); 36 q.pop(); 37 Node *v = p.second; 38 39 for (Edge *e = v->last; e; e = e->next) { 40 if (!e->to->flag && e->to->dist > e->pow + v->dist) { 41 e->to->dist = e->pow + v->dist, q.push(std::make_pair(e->to->dist, e->to)); 42 e->to->flag = 1; 43 } 44 } 45 } 46 47 } 48 49 int main() { 50 scanf("%d", &t); 51 52 while (t--) { 53 scanf("%d%d", &r, &c); 54 55 for (int i = 1; i <= (r + 1) * (c + 1); i++) node[i].flag = 0, node[i].dist = 0x7fffffff; 56 57 for (int i = 1; i <= r; i++) { 58 for (int j = 1; j <= c; j++) { 59 char ch; 60 scanf(" %c", &ch); 61 62 int l1 = (i - 1) * (c + 1) + j; 63 int l2 = i * (c + 1) + j; 64 int r1 = (i - 1) * (c + 1) + j + 1; 65 int r2 = i * (c + 1) + j + 1; 66 67 if (ch == \'/\') { 68 addE(l1, r2, 1); 69 addE(l2, r1, 0); 70 } else { 71 addE(l1, r2, 0); 72 addE(l2, r1, 1); 73 } 74 } 75 } 76 77 Dij(1); 78 /* 79 for (int i = 1; i <= (r + 1) * (c + 1); i++) { 80 if (i % (c + 1) == 0) printf("%d\\n", node[i].dist); 81 else printf("%d ", node[i].dist); 82 } 83 */ 84 85 node[(r + 1) * (c + 1)].dist == 0x7fffffff ? printf("NO SOLUTION\\n") : printf("%d\\n", node[(r + 1) * (c + 1)].dist); 86 } 87 88 return 0; 89 }
之前没加 flag ,一个点也没A。(2017-10-17 17:27)
1 #include <cstdio> 2 #include <queue> 3 4 const int MAXN = 550 * 550 * 4; 5 6 int t, r, c; 7 8 struct Edge; 9 struct Node { 10 Edge *last; 11 int dist; 12 Node () : dist(0x7fffffff) {} 13 } node[MAXN]; 14 15 struct Edge { 16 Node *from, *to; 17 int pow; 18 Edge *next; 19 Edge (Node *from, Node *to, int pow) : from(from), to(to), pow(pow), next(from->last) {} 20 }; 21 22 void addE(int x, int y, int z) { 23 node[x].last = new Edge (node + x, node + y, z); 24 node[y].last = new Edge (node + y, node + x, z); 25 } 26 27 void Dij(int s) { 28 std::priority_queue< std::pair<int, Node *>, std::vector< std::pair<int, Node *> >, std::greater< std::pair<int, Node *> > > q; 29 node[s].dist = 0; 30 q.push(std::make_pair(0, node + s)); 31 32 while (!q.empty()) { 33 std::pair<int, Node *> p = q.top(); 34 q.pop(); 35 36 Node *v = p.second; 37 38 for (Edge *e = v->last; e; e = e->next) { 39 if (e->to->dist > e->pow + v->dist) { 40 e->to->dist = e->pow + v->dist, q.push(std::make_pair(e->to->dist, e->to)); 41 } 42 } 43 } 44 45 } 46 47 int main() { 48 // freopen("cir.in", "r", stdin); 49 // freopen("cir.out", "w", stdout); 50 51 scanf("%d", &t); 52 53 while (t--) { 54 scanf("%d%d", &r, &c); 55 56 if ((r + c) & 1) { 57 printf("NO SOLUTION\\n"); 58 return 0; 59 } 60 61 for (int i = 1; i <= (r + 1) * (c + 1); i++) node[i].dist = 0x7fffffff, node[i].last = NULL; 62 63 for (int i = 1; i <= r; i++) { 64 for (int j = 1; j <= c; j++) { 65 char ch; 66 scanf(" %c", &ch); 67 68 int l1 = (i - 1) * (c + 1) + j; 69 int l2 = i * (c + 1) + j; 70 int r1 = (i - 1) * (c + 1) + j + 1; 71 int r2 = i * (c + 1) + j + 1; 72 73 if (ch == \'/\') { 74 addE(l1, r2, 1); 75 addE(l2, r1, 0); 76 } else { 77 addE(l1, r2, 0); 78 addE(l2, r1, 1); 79 } 80 } 81 } 82 83 Dij(1); 84 85 /* 86 for (int i = 1; i <= (r + 1) * (c + 1); i++) { 87 if (i % (c + 1) == 0) printf("%d\\n", node[i].dist); 88 else printf("%d ", node[i].dist); 89 } 90 */ 91 92 node[(r + 1) * (c + 1)].dist == 0x7fffffff ? printf("NO SOLUTION\\n") : printf("%d\\n", node[(r + 1) * (c + 1)].dist); 93 } 94 95 return 0; 96 }
没错,调了一下午发现 last 什么的没初始化!!!!!!!!!!!!而且之前的 flag 并没有用。(2017-10-17 20:56)
知道 WA 在哪了原来写的是 return 0; 所以在 NO SOLUTION 之后直接结束程序了,还有一点,continue 什么的要在所有读入完成之后写,不然之后的数据被读进来当成一组新的测试数据就悲剧了(血与泪的教训!!!)。(2017-10-17 21:10)
那么接下来就是MLE的一个点和T了的两个点的问题了!!
以上是关于洛谷 2243Dijkstra的主要内容,如果未能解决你的问题,请参考以下文章
洛谷 P2486 BZOJ 2243 [SDOI2011]染色
洛谷 P1529 回家 Bessie Come Home Label:Dijkstra最短路 && 乱搞