struct Graph
{
//顶点
int vertexes[MAX];
//边
int arc[MAX][MAX];
//顶点总数、边的总数
int sum_vertexes,sum_edges;
};
2、邻接表
struct graphNode
{
int name;
int weight;
struct graphNode *next;
};
struct vertexesNode
{
int name;
graphNode *firstNode;
};
struct Graph
{
vertexesNode vertexes[MAX];
int sum_vertexes,sum_edges;
};
图的建立:
<span style="font-size:12px;">//无向表
void createGraph_1(Graph &graph)
{
cout<<"输入顶点的个数"<<endl;
cin>>graph.sum_vertexes;
cout<<"输入边的个数"<<endl;
cin>>graph.sum_edges;
for(int i=0; i<graph.sum_vertexes; i++)
{
cout<<"输入第"<<i+1<<"个顶点的标识"<<endl;
cin>>graph.vertexes[i];
}
//矩阵初始化
for(int i=0; i<graph.sum_vertexes; i++)
{
for(int j=0; j<graph.sum_vertexes; j++)
{
graph.arc[i][j]=0;
}
}
for(int i=0; i<graph.sum_edges; i++)
{
int x;
int y;
int weight;
cout<<"输入第"<<i+1<<"条边的两个定点和该边的权重"<<endl;
cin>>x>>y>>weight;
graph.arc[x][y]=graph.arc[y][x]=weight;
}
}
//有向表
void createGraph_2(Graph &graph)
{
cout<<"输入顶点的个数"<<endl;
cin>>graph.sum_vertexes;
cout<<"输入边的个数"<<endl;
cin>>graph.sum_edges;
for(int i=0; i<graph.sum_vertexes; i++)
{
cout<<"输入第"<<i+1<<"个顶点的标识"<<endl;
cin>>graph.vertexes[i];
}
//矩阵初始化
for(int i=0; i<graph.sum_vertexes; i++)
{
for(int j=0; j<graph.sum_vertexes; j++)
{
graph.arc[i][j]=0;
}
}
for(int i=0; i<graph.sum_edges; i++)
{
int x;
int y;
int weight;
cout<<"输入第"<<i+1<<"条弧的弧尾 弧头 权重"<<endl;
cin>>x>>y>>weight;
graph.arc[x][y]=weight;
}
}</span>
<span style="font-size:12px;">//无向图
void createGraph_1(Graph &graph)
{
cout<<"输入图的顶点的个数"<<endl;
cin>>graph.sum_vertexes;
cout<<"输入图的边的个数"<<endl;
cin>>graph.sum_edges;
for(int i=0; i<graph.sum_vertexes; i++)
{
cout<<"输入第"<<i+1<<"个顶点的标识"<<endl;
cin>>graph.vertexes[i].name;
graph.vertexes[i].firstNode=NULL;
}
for(int i=0; i<graph.sum_edges; i++)
{
int x,y,weight;
int x_pos,y_pos;
cout<<"输入第"<<i+1<<"条边的两个顶点和权重"<<endl;
cin>>x>>y>>weight;
for(int j=0; j<graph.sum_vertexes; j++)
{
if(graph.vertexes[j].name==x)
{
x_pos=j;
break;
}
}
for(int j=0; j<graph.sum_vertexes; j++)
{
if(graph.vertexes[j].name==y)
{
y_pos=j;
break;
}
}
graphNode *temp_x=new graphNode();
temp_x->weight=weight;
temp_x->name=y;
temp_x->next=graph.vertexes[x_pos].firstNode;
graph.vertexes[x_pos].firstNode=temp_x;
graphNode *temp_y=new graphNode();
temp_y->weight=weight;
temp_y->name=x;
temp_y->next=graph.vertexes[y_pos].firstNode;
graph.vertexes[y_pos].firstNode=temp_y;
}
}
//有向图
void createGraph_2(Graph &graph)
{
cout<<"输入图的顶点的个数"<<endl;
cin>>graph.sum_vertexes;
cout<<"输入图的边的个数"<<endl;
cin>>graph.sum_edges;
for(int i=0; i<graph.sum_vertexes; i++)
{
cout<<"输入第"<<i+1<<"个顶点的标识"<<endl;
cin>>graph.vertexes[i].name;
graph.vertexes[i].firstNode=NULL;
}
for(int i=0; i<graph.sum_edges; i++)
{
int x,y,weight;
int x_pos,y_pos;
cout<<"输入第"<<i+1<<"条弧的弧尾 弧首 权重"<<endl;
cin>>x>>y>>weight;
for(int j=0; j<graph.sum_vertexes; j++)
{
if(graph.vertexes[j].name==x)
{
x_pos=j;
break;
}
}
graphNode *temp_x=new graphNode();
temp_x->weight=weight;
temp_x->name=y;
temp_x->next=graph.vertexes[x_pos].firstNode;
graph.vertexes[x_pos].firstNode=temp_x;
}
}</span>
图的遍历:
<span style="font-size:12px;">void DFS(Graph graph,int i)
{
visited[i]=1;
//do something
cout<<graph.vertexes[i]<<endl;
for(int j=0; j<graph.sum_vertexes; j++)
{
if(graph.arc[i][j]!=0&&visited[j]==0)
{
DFS(graph,j);
}
}
}
void DFSTraverse(Graph graph)
{
for(int i=0; i<graph.sum_vertexes; i++)
visited[i]=0;
for(int i=0; i<graph.sum_vertexes; i++)
if(visited[i]==0)
DFS(graph,i);
}</span>
<span style="font-size:12px;">void DFS(Graph graph,int i)
{
visited[i]=1;
cout<<graph.vertexes[i].name<<endl;
graphNode *node=graph.vertexes[i].firstNode;
while(node)
{
if(visited[node->name]==0)
DFS(graph,node->name);
node=node->next;
}
}
void DFSTraverse(Graph graph)
{
for(int i=0; i<graph.sum_vertexes; i++)
visited[i]=0;
for(int i=0; i<graph.sum_vertexes; i++)
if(visited[i]==0)
DFS(graph,i);
}
</span>
<span style="font-size:12px;">oid BFSTraverse(Graph graph)
{
queue<int> q;
for(int i=0; i<graph.sum_vertexes; i++)
visited[i]=0;
for(int i=0; i<graph.sum_vertexes; i++)
{
if(visited[i]==0)
{
visited[i]=1;
//do something
cout<<graph.vertexes[i]<<endl;
q.push(graph.vertexes[i]);
while(!q.empty())
{
int temp=q.front();
q.pop();
for(int j=0; j<graph.sum_vertexes; j++)
{
if(graph.arc[temp][j]!=0&&visited[j]==0)
{
visited[j]=1;
//do something
cout<<graph.vertexes[j]<<endl;
q.push(graph.vertexes[j]);
}
}
}
}
}
}</span>
<span style="font-size:12px;">void BFSTraverse(Graph graph)
{
queue<int> q;
for(int i=0; i<graph.sum_vertexes; i++)
visited[i]=0;
for(int i=0; i<graph.sum_vertexes; i++)
{
if(visited[i]==0)
{
visited[i]=1;
//do something
cout<<graph.vertexes[i].name<<endl;
q.push(graph.vertexes[i].name);
while(!q.empty())
{
int temp=q.front();
q.pop();
graphNode *node=graph.vertexes[temp].firstNode;
while(node)
{
if(visited[node->name]==0)
{
q.push(node->name);
//do something
cout<<node->name<<endl;
visited[node->name]=1;
}
node=node->next;
}
}
}
}
}</span>
因篇幅问题不能全部显示,请点此查看更多更全内容