华为9.1机试第二题,构造图DFS想不通为什么过25%

#include <iostream>
#include<vector>
#include<string>
#include<sstream>
#include<unordered_map>
#include<algorithm>
#include<set>
using namespace std;
//表示图中的节点,
//把图建出来,
struct node {
    // type = 1是class,type=2是实例
    int type;
    string s;
    vector<node*>next; //代表下一个节点,
    node(int t,string s1) :type(t),s(s1),next(0){}
};
vector<string>res;
void dfs(node* begin)
{
    if (!begin) return;//已经到达最后了
    for (node* next : begin->next) //遍历所有的边
    {
        if (next->type == 1)
        {
            res.push_back(next->s);
        }
        dfs(next);
    }
}
int main()
{
    unordered_map<string, node*>occur;//根据string映射点,防止重复建点
    int n;
    cin >> n;//一共有n条边
    string s1;
    string find;
    int i = -1;
    //首先读出n对关系
    while (getline(cin, s1))
    {
        stringstream ss(s1);
        string str;
        vector<string>strs;
        i++;
        if (i == n + 1)
        {
            find = s1;
            break;
        }
        while (getline(ss, str, ' '))
        {
            if (i > 0)
                strs.push_back(str); //获取到一个三元组关系,开始建立点或边
        }
        /*起点、终点、关系*/
        if (strs.size() == 3)
        {
            string end = strs[0], begin = strs[2], relate = strs[1];
            node* a = nullptr;
            if (!occur.count(end)) //如果没有该节点则新建一个
            {
                if (relate[0] == 'i') //这是概念-实例联系
                    a = new node(1, end);
                else a = new node(2, end);//这是概念-子概念联系
                occur[end] = a;
            }
            else a = occur[end];//a是终点
            //同样构造起点
            node* b = nullptr;
            if (!occur.count(begin))
            {
                b = new node(1, begin);//建立起点
                occur[begin] = b;
            }
            else b = occur[begin];//如果已经有了直接读出来
            b->next.push_back(a);//建立 b->a 边的联系
        }
    }
    node* b = occur[find];
    // 已经找到了find节点,然后开始根据find为起点开始dfs
    dfs(b);
    if (res.empty())
    {
        cout << "empty";
        return 0;
    }
    set<string>tmp;
    for (auto ele : res)
        tmp.emplace(ele);
    res.clear();
    for (auto ele : tmp)
        res.push_back(ele);
    sort(res.begin(), res.end());
    for (auto s : res)
    {
        cout << s << " ";
    }

    return 0;
}

#华为##笔经#
全部评论
从起始点开始,找到图里边所有出度为0的点,如果是实例就保存结果。实在想不通为啥不能ac啊,求指教!!!
点赞 回复 分享
发布于 2021-09-01 21:16
我用的并查集做的,想问下,直接for循环cin读数据不行吗???一直有问题。。气死
点赞 回复 分享
发布于 2021-09-01 21:20
我用dfs过了65%
点赞 回复 分享
发布于 2021-09-01 21:47
题目大概是什么。。leetcode有类似的题目吗。。慌死下周就要考了,华为这么难的吗
点赞 回复 分享
发布于 2021-09-01 23:00
第二题我a了,求问有人知道第一题会吗,第三题我知道是最小斯坦纳树了。。
点赞 回复 分享
发布于 2021-09-02 00:06
图的dfs肯定可以搞出来,我做的话,我的结构体就会定义成一个key,概念,一个数组存实例,一个数组存子概念们。图中节点放在哈希表中,建图的时候可以查,有没有存在。最后查某个节点的所有实例就是dfs,然后把每个节点的实例数组遍历,接着就是去重,自定义排序,输出
点赞 回复 分享
发布于 2021-09-02 09:02

相关推荐

挣K存W养DOG:入职送金条全球游,路过缅甸停一下🐔
点赞 评论 收藏
分享
评论
点赞
6
分享
牛客网
牛客企业服务