zoukankan      html  css  js  c++  java
  • hdu 2874

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

    首先用的是动态邻接表,起初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 }
    说一下,良好的习惯很重要,如果我是之后判断问题的话就不会出现那么多纠结的事了。。。。。。。。
  • 相关阅读:
    Python解释器相关知识
    简单了解下Flask
    Scoket编程
    __file__的作用
    jquery编写可折叠列表
    浑浑噩噩的一天
    js实现杨辉三角
    js闭包
    python读取word表格
    HTMLTestRunner报告
  • 原文地址:https://www.cnblogs.com/Shirlies/p/2427700.html
Copyright © 2011-2022 走看看