洛谷 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 }
只A了一个点的代码

 之前没加 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 }
A 了五个,WA了俩,MLE了仨

 

 没错,调了一下午发现 last 什么的没初始化!!!!!!!!!!!!而且之前的 flag 并没有用。(2017-10-17 20:56

 

 知道 WA 在哪了原来写的是 return 0; 所以在 NO SOLUTION 之后直接结束程序了,还有一点,continue 什么的要在所有读入完成之后写,不然之后的数据被读进来当成一组新的测试数据就悲剧了(血与泪的教训!!!)。(2017-10-17 21:10)

 

 那么接下来就是MLE的一个点和T了的两个点的问题了!!

 

                                                   

 

以上是关于洛谷 2243Dijkstra的主要内容,如果未能解决你的问题,请参考以下文章

洛谷 P2243 电路维修

洛谷 P2486 BZOJ 2243 [SDOI2011]染色

洛谷 P1529 回家 Bessie Come Home Label:Dijkstra最短路 && 乱搞

POJ - 2778 ~ HDU - 2243 AC自动机+矩阵快速幂

AC日记——[SDOI2010]大陆争霸 洛谷 P3690

[洛谷1342]请柬