比较重量 网易2016实习研发工程师编程题

题目:

小明陪小红去看钻石,他们从一堆钻石中随机抽取两颗并比较她们的重量。这些钻石的重量各不相同。在他们们比较了一段时间后,它们看中了两颗钻石g1和g2。现在请你根据之前比较的信息判断这两颗钻石的哪颗更重。

给定两颗钻石的编号g1,g2,编号从1开始,同时给定关系数组vector,其中元素为一些二元组,第一个元素为一次比较中较重的钻石的编号,第 二个元素为较轻的钻石的编号。最后给定之前的比较次数n。请返回这两颗钻石的关系,若g1更重返回1,g2更重返回-1,无法判断返回0。输入数据保证合 法,不会有矛盾情况出现。

测试样例:
2,3,[[1,2],[2,4],[1,3],[4,3]],4
返回: 1
 
 1 #include <iostream>
 2 #include <vector>
 3 #include <string>
 4 #include <queue>
 5 #include <unordered_map>
 6 #include <algorithm>
 7 using namespace std;
 8 
 9 /*
10 1>2
11 2>4
12 1>3
13 4>3
14 要判断2和3的关系
15 如果从2开始能遍历到3,那么2>3,反之2<3
16 类似图的广度优先遍历
17 1 建立一个哈希表,把左元素作为key,把右元素作为value(vector<int>结构)
18 2 以g1开始广度优先遍历,直到遍历到g2,则g1>g2;否则以g2开始广度优先遍历,直到遍历到g1,则g1<g2;否则条件不足无法判断
19 2.1 把与g1相连的顶点(即g1作为key对应的value)依次入队列
20 2.2 用一个哈希表标记遍历情况,key是顶点,value(bool类型)标记是否遍历过
21 */
22 
23 class Cmp {
24     bool compare(int g1, int g2, unordered_map<int, vector<int>> graph)
25     {
26         queue<int> que;
27         que.push(g1);
28         unordered_map<int, int> flag;
29         int temp;
30         while (!que.empty())
31         {
32             temp = que.front();
33             flag[temp] = 1;
34             que.pop();
35             if (temp == g2)
36                 return true;
37             else
38             {
39                 for (int i = 0;i < graph[temp].size();i++)
40                 {
41                     if (!flag[graph[temp][i]])//如果graph[temp][i]没有被遍历过
42                         que.push(graph[temp][i]);
43                 }
44             }
45         }
46         return false;
47     }
48 public:
49     int cmp(int g1, int g2, vector<vector<int> > records, int n) {
50         // write code here
51         unordered_map<int, vector<int>> graph;
52         for (int i = 0;i < n;i++)
53             graph[records[i][0]].push_back(records[i][1]);    
54         if (compare(g1, g2, graph))
55             return 1;
56         else
57         {
58             if (compare(g2, g1, graph))
59                 return -1;
60             else
61                 return 0;        
62         }
63     }
64 };
65 
66 /*
67 测试样例:
68 2, 3, [[1, 2], [2, 4], [1, 3], [4, 3]], 4
69 返回: 1
70 */
71 int main()
72 {
73     vector<vector<int> > v{ {1,2},{2,4},{1,3},{4,3} };
74     Cmp solution;
75     cout<<solution.cmp(2,3,v,4);
76     return 0;
77 }
原文地址:https://www.cnblogs.com/hslzju/p/5714795.html