中国大学MOOC-数据结构基础习题集、09-3、Hashing - Hard Version

声明:非本人原创,原文地址:http://blog.sina.com.cn/s/blog_ce1b01420102vizs.html

这篇博文的思路是非常正确的,但是程序无法编译。比如vector *G,在codeblocks无法编译成功。因此博主做了一些改动,以便能正常编译运行。具体的思路和代码都是原博主提供的,版权为原博主所有。本人仅在此直接粘出一份能运行的代码。

 1 #include <iostream>
 2 #include <vector>
 3 #include <queue>
 4 
 5 using namespace std;
 6 
 7 struct node
 8 {
 9     int x;
10     int y;
11     node(int a, int b):x(a),y(b) {}
12 };
13 
14 int main()
15 {
16     int N;
17     cin >> N;
18     int *Hash = new int[N];
19     int *Degree = new int[N];
20     vector<vector<int> > G(N);
21     vector<int> Ans;
22     // 输入哈希序列
23     for(int i=0; i<N; i++)
24     {
25         cin >> Hash[i];
26         if(Hash[i] >= 0)
27             Degree[i] = 0; //如果大于等于0,初始化为0
28         else
29             Degree[i] = -1;//如果小于0,入度记为-1,表示没有元素
30     }
31     // 计算入度并建立有向图
32     for(int i=0; i<N; i++)
33     {
34         if(Hash[i] < 0) continue;
35         int CurPos = i;                         //当前坐标
36         int HashPos = Hash[i] % N;              //散列后的坐标
37         Degree[i] = (CurPos - HashPos + N) % N; //计算入度,即冲突次数
38         for(int s = 0; s < Degree[i]; s++)      //把Key%N 到 i - 1 的顶点指向 i
39         {
40             G[(HashPos + s + N) % N].push_back(i);
41         }
42     }
43     // 拓扑排序
44     typedef pair<int, int> PAIR;
45     priority_queue< PAIR, vector< PAIR >, greater< PAIR > > Q; //优先队列
46     for(int i = 0; i < N; i++)
47         if(Degree[i] == 0)                      //入度为0的入队
48         {
49             Q.push(PAIR(Hash[i],i));
50         }
51     while(!Q.empty())
52     {
53         PAIR p = Q.top();                       //每次取出当前入度为0的顶点中Key最小的
54         int V = p.second;                       //second为顶点
55         Ans.push_back(p.first);                 //first为该顶点的Key
56         Q.pop();
57         for(int i = 0; i < G[V].size(); i++)    //扫描关联顶点,入度处理
58             if (--Degree[G[V][i]] == 0)
59                 Q.push(PAIR(Hash[G[V][i]], G[V][i]));
60     }
61     cout << Ans[0];
62     for(int i = 1; i < Ans.size(); i++)
63         cout << ' ' << Ans[i];
64     return 0;
65 }

 

posted @ 2015-02-02 22:25  聪明的聪聪  阅读(560)  评论(0编辑  收藏  举报