-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathGraph
50 lines (41 loc) · 1.76 KB
/
Graph
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
class Graph{
public:
vector<vector<int>> adj; //邻接表
//unordered_map< pair<int,int>,Edge*,hash_edge> Edge_semble; //通过一对键值找到Edge的地址
vector<unordered_map< int, priority_queue<Edge*>> > Edge_classfy_bynodeid; //根据某一个顶点int,与其相连的所有的边
//for example
//adj[0][ii] = {1,5,6} //表示0和1、5、6相连
// Edge_semble[{0,1}]表示由0和1组成的边 //不合适已经弃用
//Edge_classfy_bynodeid[0][1] = 所有01的优先队列的边
Graph(int n); //n为确定点的总个数
void appendEdge(int node1_id,int node2_id,int d); //两个点和一个d的长度
priority_queue<Edge*> pq(int,int); //两个点返回这两个点之间所有边的优先队列,不存在则返回空{}
vector<Edge*> findedge_nodes(int,int,bool isneedvalid); //如果isneedvalid等于true就是要取出所有不满的edge,false就是不管满不满都要
//存储一个临接表
//
};
Graph::Graph(int n){
adj.resize(n);
Edge_classfy_bynodeid.resize(n);
}
void Graph::appendEdge(int node1_id,int node2_id,int d){
Edge* edge = new Edge(node1_id,node2_id,d);
adj[node1_id].push_back(node2_id);
adj[node2_id].push_back(node1_id);
Edge_classfy_bynodeid[node1_id][node2_id].push(edge);
Edge_classfy_bynodeid[node2_id][node1_id].push(edge);
}
priority_queue<Edge*> Graph::pq(int node1_id,int node2_id){
return Edge_classfy_bynodeid[node1_id][node2_id];
}
vector<Edge*> Graph::findedge_nodes(int node1_id,int node2_id,bool isneedvalid){
vector<Edge*> ans;
priority_queue<Edge*> s = pq(node1_id,node2_id);
while(!s.empty()){
if(!isneedvalid || s.top()->Edgeisvalid()){
ans.insert(ans.begin(),s.top());
}
s.pop();
}
return ans;
}