//bfs and dfs
#include<iostream>
#include<queue>
using namespace std;
#define N 10
#define WHITE 0
#define GRAY 1
#define BLACK 2
int time ;
struct Edge{
Edge* next;
int start ;
int end ;
int weight;
Edge(int s,int e):start(s),end(e){
weight = 1;
next = NULL;
}
};
struct Vext{
int color;
int pi;
int d;
int f;
Edge* head;
Vext(){
head = NULL;
f = 0 ;
}
};
struct cmp{
bool operator()(Vext a,Vext b){
return a.f<b.f;
}
};
struct Graph{
Vext* p;
int n;
queue<int> Q;
priority_queue<Vext,vector<Vext>,cmp> que;
Graph(int num):n(num){
p = new Vext [n];
}
~Graph(){
delete [] p;
}
void addSingle(int s,int e){
Edge *pe = new Edge(s,e);
if(p[s].head==NULL||p[s].head->end>e){
pe->next = p[s].head;
p[s].head = pe;
}else{
Edge *tmp = p[s].head,*pre=tmp;
while(tmp!=NULL&&tmp->end<e){
pre = tmp;
tmp = tmp->next;
}
if(tmp!=NULL&&tmp->end==e){
delete tmp;
return ;
}
pe->next = tmp;
pre->next =pe;
}
}
void addDouble(int s,int e){
addSingle(s,e);
addSingle(e,s);
}
void deleteSingle(int s,int e){
Edge* tmp = p[s].head;
Edge* pre;
while(tmp->end!=e&&tmp!=NULL){
pre = tmp;
tmp = tmp->next;
}
if(tmp == NULL||tmp->end>e)return ;
if(tmp==p[s].head)
p[s].head=tmp->next;
else{
pre->next = tmp->next;
}
}
void deleteDouble(int s,int e){
deleteSingle(s,e);
deleteSingle(e,s);
}
void dfs_visit(int u){
p[u].color = GRAY;
time +=1;
p[u].d =time;
Edge* pe =p[u].head;
while(pe!=NULL){
if(p[pe->end].color==WHITE){
dfs_visit(pe->end);
}
pe = pe->next;
}
p[u].color = BLACK;
p[u].f = ++time;
}
void dfs(){
for(int i=0;i<n;++i){
p[i].color = WHITE;
p[i].d = 0;
p[i].pi = -0xfffffff;
}
time = 0;
for(int j=0;j<n;++j){
if(p[j].color == WHITE)
{
dfs_visit(j);
}
}
}//dfs和 bfs的时间复杂度都是O(V+E)
void topo(){//拓扑排序
dfs();
for(int i=0;i<n;++i){
que.push(p[i]);
}
for(int j=0;j<n;++j)
{
cout<<que.top().f<<" ";
que.pop();
}
cout<<endl;
}
};
int main(){
Graph graph(5);
graph.addSingle(0,1);
graph.addSingle(0,2);
graph.addSingle(0,3);
graph.addSingle(1,2);
graph.addSingle(2,4);
graph.topo();
return 0;
}
//bfs and dfs
#include<iostream>
#include<queue>
using namespace std;
#define N 10
#define WHITE 0
#define GRAY 1
#define BLACK 2
int time ;
struct Edge{
Edge* next;
int start ;
int end ;
int weight;
Edge(int s,int e):start(s),end(e){
weight = 1;
next = NULL;
}
};
struct Vext{
int color;
int pi;
int d;
int f;
Edge* head;
Vext(){
head = NULL;
f = 0 ;
}
};
struct cmp{
bool operator()(Vext a,Vext b){
return a.f<b.f;
}
};
struct Graph{
Vext* p;
int n;
queue<int> Q;
priority_queue<Vext,vector<Vext>,cmp> que;
Graph(int num):n(num){
p = new Vext [n];
}
~Graph(){
delete [] p;
}
void addSingle(int s,int e){
Edge *pe = new Edge(s,e);
if(p[s].head==NULL||p[s].head->end>e){
pe->next = p[s].head;
p[s].head = pe;
}else{
Edge *tmp = p[s].head,*pre=tmp;
while(tmp!=NULL&&tmp->end<e){
pre = tmp;
tmp = tmp->next;
}
if(tmp!=NULL&&tmp->end==e){
delete tmp;
return ;
}
pe->next = tmp;
pre->next =pe;
}
}
void addDouble(int s,int e){
addSingle(s,e);
addSingle(e,s);
}
void deleteSingle(int s,int e){
Edge* tmp = p[s].head;
Edge* pre;
while(tmp->end!=e&&tmp!=NULL){
pre = tmp;
tmp = tmp->next;
}
if(tmp == NULL||tmp->end>e)return ;
if(tmp==p[s].head)
p[s].head=tmp->next;
else{
pre->next = tmp->next;
}
}
void deleteDouble(int s,int e){
deleteSingle(s,e);
deleteSingle(e,s);
}
void dfs_visit(int u){
p[u].color = GRAY;
time +=1;
p[u].d =time;
Edge* pe =p[u].head;
while(pe!=NULL){
if(p[pe->end].color==WHITE){
dfs_visit(pe->end);
}
pe = pe->next;
}
p[u].color = BLACK;
p[u].f = ++time;
}
void dfs(){
for(int i=0;i<n;++i){
p[i].color = WHITE;
p[i].d = 0;
p[i].pi = -0xfffffff;
}
time = 0;
for(int j=0;j<n;++j){
if(p[j].color == WHITE)
{
dfs_visit(j);
}
}
}//dfs和 bfs的时间复杂度都是O(V+E)
void topo(){//拓扑排序
dfs();
for(int i=0;i<n;++i){
que.push(p[i]);
}
for(int j=0;j<n;++j)
{
cout<<que.top().f<<" ";
que.pop();
}
cout<<endl;
}
};
int main(){
Graph graph(5);
graph.addSingle(0,1);
graph.addSingle(0,2);
graph.addSingle(0,3);
graph.addSingle(1,2);
graph.addSingle(2,4);
graph.topo();
return 0;
}
05-25
1万+
07-12
3万+
04-16
“相关推荐”对你有帮助么?
-
非常没帮助
-
没帮助
-
一般
-
有帮助
-
非常有帮助
提交