zoukankan      html  css  js  c++  java
  • ACdream 1728 SJY's First Task

    简单题。

    先建树,我用邻接表来存了。然后对于每个叶子结点DFS一下,DFS深度超过了K就return,找到了叶子节点就记录下来,最后排个序,然后输出答案。

    由于结点编号比较奇葩,所以用两个map来转换一下。这个代码写的很丑,大半夜写的,迷迷糊糊。

    #include<cstdio>
    #include<cstring>
    #include<cmath>
    #include<map>
    #include<string>
    #include<vector>
    #include<iostream>
    #include<algorithm>
    using namespace std;
    
    char s[1000];
    map<int, int>zh;
    map<int, int>ff;
    vector<int>ljb[100000];
    int flag[100000], rr[100000];
    int ls, K, ye;
    int u[1000], k[105];
    struct ANS
    {
        int A, B, C;
    }ans[10000 + 10];
    int gh = 0;
    
    bool cmp(const ANS&a, const ANS&b)
    {
        if (a.A == b.A&&a.B == b.B) return a.C<b.C;
        if (a.A == b.A) return ff[a.B]<ff[b.B];
        return ff[a.A]<ff[b.A];
    }
    void DFS(int now, int b)
    {
        if (b>K) return;
        int i;
        if (flag[now] == 1 && now != ye)
        {
            ans[gh].A = ye;
            ans[gh].B = now;
            ans[gh].C = b;
            gh++;
            return;
        }
        for (i = 0; i<ljb[now].size(); i++)
        {
            if (rr[ljb[now][i]] == 0)
            {
                rr[ljb[now][i]] = 1;
                DFS(ljb[now][i], b + 1);
            }
        }
    
    }
    int main()
    {
        int n, i, j, o;
        while (~scanf("%d", &K))
        {
            scanf("%d", &n);
            zh.clear(); ff.clear();
            memset(flag, 0, sizeof(flag));
            int p = 1, tot; gh = 0;
            zh[774388357] = p;
            ff[p] = 774388357;
            p++;
            for (i = 0; i<100000; i++) ljb[i].clear();
            for (o = 0; o<n; o++)
            {
                scanf("%d %s", &k[o], s);
                ls = 0;
                if (zh[k[o]] == 0) zh[k[o]] = p, ff[p] = k[o], p++;
                flag[zh[k[o]]] = 1;
                int len = strlen(s);
                j = 0; tot = 0;
                for (i = 0; i <= len; i++)
                {
                    if (s[i] == ',' || s[i] == '')
                    {
                        if (zh[ls] == 0) zh[ls] = p,ff[p] = ls,p++;
                        u[tot] = zh[ls], tot++, ls = 0;
                    }
                    else ls = ls * 10 + s[i] - '0';    
                }
                ljb[1].push_back(u[0]);
                ljb[u[0]].push_back(1);
                for (i = 1; i<tot; i++)
                {
                    ljb[u[i - 1]].push_back(u[i]);
                    ljb[u[i]].push_back(u[i - 1]);
                }
                ljb[u[tot - 1]].push_back(zh[k[o]]);
                ljb[zh[k[o]]].push_back(u[tot - 1]);
            }
            for (i = 0; i<n; i++)
            {
                ye = zh[k[i]];
                memset(rr, 0, sizeof(rr));
                rr[ye] = 1;
                DFS(ye, 0);
            }
            sort(ans, ans + gh, cmp);
            for (i = 0; i<gh; i++)
            {
                cout << ff[ans[i].A];
                cout << " ";
                cout << ff[ans[i].B];
                cout << " ";
                cout << ans[i].C;
                cout << endl;
            }
        }
        return 0;
    }
  • 相关阅读:
    RDD, DataFrame or Dataset
    RDD的基础知识
    RDD的源码
    窄依赖与宽依赖&stage的划分依据
    HDFS中的读写数据流
    HDFS的Java API
    使用distcp并行拷贝大数据文件
    Flume+Morphlines实现数据的实时ETL
    磕碰,擦伤了,紧急处理方法
    redis linux 基本命令
  • 原文地址:https://www.cnblogs.com/zufezzt/p/4640466.html
Copyright © 2011-2022 走看看