Shirlies
宁静专注认真的程序媛~

痛苦啊。。。折磨我好长时间啊,不过总算把错误给搞出来了,也学到了一点东西。。。。。。哎,可是这折磨貌似太长了。。。。。。。。。。。。。。。。。。。。

首先用的是动态邻接表,起初WA,之后MLE,晕,不过知道了动态邻接表为什么会MLE了:起初分配的内存没有释放,而且题目说有大量的输入,这样就会越积越多。。。

然后就是用vector,也是一直WA,郁闷,和网上的代码对比之后,改了一通,A了之后,忽然知道哪里错了,就是当是同一个点的时候,那个vis数组要放在lca函数的开头,如果放中间,因为我是首先判断有没有答案的,所以如果是同一个点的话,如果vis放中间的话,同一个点是无法判断的它之间的距离的。。。。。。。。。。。。。。。。。。。。

总结一下:当n值够大的时候,尽量不要用vector;当输入大量数据的时候尽量不要用动态链表;最妙的选择是静态链表。。。。。。。(~ o ~)~zZ

这个是正确的
这个是vis放错位置后的错误。。。。。。。。。。。。。。。。。
View Code
  1 #include <cstdio>
2 #include <cstring>
3 #include <vector>
4 using namespace std;
5
6 const int limit = 10010;
7 const int maxn = 1000005;
8
9 struct node
10 {
11 int tag;
12 int w;
13 };
14
15 vector<node> pnt[limit];
16 vector<node> que[limit];
17 int n,m,c;
18 int f[limit];
19 int vis[limit];
20 int ans[maxn];
21 int dis[limit];
22
23 void init()
24 {
25 for(int i =1;i <= n;i ++)
26 {
27 f[i] = i;
28 pnt[i].clear();
29 que[i].clear();
30 }
31 memset(ans,-1,sizeof(ans));
32 memset(vis,0,sizeof(vis));
33 memset(dis,0,sizeof(dis));
34 }
35
36 int find(int x)
37 {
38 if(x == f[x])
39 return x;
40
41 f[x] = find(f[x]);
42 return f[x];
43 }
44
45 void join(int x,int y)
46 {
47 int fx = find(x);
48 int fy = find(y);
49
50 if(fx == fy)
51 return;
52
53 f[fx] = fy;
54 }
55
56 void lca(int x,int d)
57 {
58 dis[x] = d;
59 vis[x] = 1;//!!!
60 int size = que[x].size();
61 for(int i = 0;i < size;i ++)
62 {
63 if(vis[que[x].at(i).tag])
64 {
65 ans[que[x].at(i).w] = dis[x] + dis[que[x].at(i).tag] - 2 * dis[find(que[x].at(i).tag)];
66 }
67 }
68
69 //vis[x] = 1;//一定要注意。。。。。。
70 size = pnt[x].size();
71 for(int i = 0;i < size;i ++)
72 {
73 if(!vis[pnt[x].at(i).tag])
74 {
75 lca(pnt[x].at(i).tag,d + pnt[x].at(i).w);
76 join(pnt[x].at(i).tag ,x);
77 }
78 }
79 }
80
81 int main()
82 {
83 while(scanf("%d%d%d",&n,&m,&c) == 3)
84 {
85 init();
86
87 int a,b,w;
88 for(int i = 0;i < m; i++)
89 {
90 scanf("%d%d%d",&a,&b,&w);
91 node t;
92 t.tag = a;
93 t.w = w;
94 pnt[b].push_back(t);
95 t.tag = b;
96 pnt[a].push_back(t);
97 join(a,b);
98 }
99
100
101 for(int i = 0;i < c;i ++)
102 {
103 scanf("%d%d",&a,&b);
104 if(find(a) != find(b))
105 {
106 ans[i] = -1;
107 continue;
108 }
109 node t;
110 t.tag = a;
111 t.w = i;
112 que[b].push_back(t);
113 t.tag = b;
114 que[a].push_back(t);
115 }
116 for(int i = 1;i <= n;i ++)
117 f[i] = i;
118
119
120 for(int i = 1; i <= n;i ++)
121 {
122 if(!vis[i])
123 lca(i,0);
124 }
125
126 for(int i = 0;i < c;i ++)
127 {
128 if(ans[i] == -1)
129 {
130 printf("Not connected\n");
131 }
132 else
133 {
134 printf("%d\n",ans[i]);
135 }
136 }
137 }
138
139 return 0;
140 }
说一下,良好的习惯很重要,如果我是之后判断问题的话就不会出现那么多纠结的事了。。。。。。。。
posted on 2012-03-31 22:08  Shirlies  阅读(837)  评论(0编辑  收藏  举报