-
Notifications
You must be signed in to change notification settings - Fork 1
Expand file tree
/
Copy pathinterface.cpp
More file actions
94 lines (87 loc) · 2.17 KB
/
Copy pathinterface.cpp
File metadata and controls
94 lines (87 loc) · 2.17 KB
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
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
#include "stone_internal_header.h"
#include "graph_visualization.h"
vector<int>* undirectionalize(int n,vector<int>* arr){
vector<int>* grr=new vector<int>[n];
vector<pair<int,int>> edges;
for(int i=0;i<n;i++)
for(int j:arr[i])
if(i<j)
edges.emplace_back(i,j);
else if(i>j)
edges.emplace_back(j,i);
sort(edges.begin(),edges.end());
edges.resize(unique(edges.begin(),edges.end())-edges.begin());
for(auto[x,y]:edges){
grr[x].push_back(y);
grr[y].push_back(x);
}
return grr; // use delete[] grr later
}
bool is_undirected(int n,vector<int>* arr){
set<pair<int,int>> S;
for(int i=0;i<n;i++)
for(int j:arr[i])
S.emplace(i,j);
for(auto[i,j]:S)
if(S.find({j,i})==S.end())
return false;
return true;
}
pair<int*,int*> embad_unit(int n,vector<int>* grr,int w,int h){
int* x=new int[n];
int* y=new int[n];
if(is_tree(n,grr))
embad_tree(n,grr,w,h,x,y);
else if(is_bipartite(n,grr))
embad_bipartite(n,grr,w,h,x,y);
else if(is_cactus(n,grr))
embad_cactus(n,grr,w,h,x,y);
else if(is_planar(n,grr))
embad_planar(n,grr,w,h,x,y);
else
embad_general(n,grr,w,h,x,y);
return {x,y};
}
void dfs_con(int x,vector<int>* arr,int* vit,vector<int>& out){
vit[x]=1;
out.push_back(x);
for(int y:arr[x])if(!vit[y])
dfs_con(y,arr,vit,out);
}
void graph_visualization(int n,vector<int>* arr,string filename,int w,int h){
int* x=new int[n];
int* y=new int[n];
vector<int>* grr=undirectionalize(n,arr);
int* vit=new int[n]; memset(vit,0,n*sizeof(int));
int prev=0;
for(int i=0;i<n;i++){
if(vit[i])continue;
vector<int> uv;
dfs_con(i,grr,vit,uv);
sort(uv.begin(),uv.end());
vector<int>* unit=new vector<int>[uv.size()];
map<int,int> inv_uv;
for(int i=0;i<uv.size();i++)
inv_uv[uv[i]]=i;
for(int u:uv)
for(int v:grr[u])
unit[inv_uv[u]].push_back(inv_uv[v]);
auto[ux,uy]=embad_unit(uv.size(),unit,w*uv.size()/n,h);
for(int i=0;i<uv.size();i++){
x[uv[i]]=ux[i]+prev;
y[uv[i]]=uy[i];
}
delete[] ux;
delete[] uy;
delete[] unit;
prev+=w*uv.size()/n;
}
delete [] vit;
delete [] grr;
if(is_undirected(n,arr))
make_svg_undirected(filename,w,h,n,arr,x,y);
else
make_svg(filename,w,h,n,arr,x,y);
delete [] x;
delete [] y;
}