[NEFU锐格 数据结构]实验五六 图有关的操作
Posted 鱼竿钓鱼干
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了[NEFU锐格 数据结构]实验五六 图有关的操作相关的知识,希望对你有一定的参考价值。
[NEFU锐格 数据结构]实验五六 图有关的操作
知识点
题目 | 知识点 |
---|---|
7043 | 无向图广度优先遍历 |
7039 | 有向图DFS和打印邻接表 |
7040 | 建图,求度数 |
7042 | 无向图非递归DFS |
7041 | 求拓扑序列 |
题目
7043
利用邻接表实现无向图的广度优先遍历
#include<iostream>
#include<cstring>
#include<queue>
using namespace std;
const int MAXN=105;
typedef struct ArcNode{
int adjvex;
struct ArcNode * nextarc;
}ArcNode;
typedef struct VNode{
int data;
ArcNode *firstarc;
}VNode,AdjList[MAXN];
typedef struct{
AdjList verlist;
int vexnum,arcnum;
}Graph;
void CreateUDG(Graph &G){
cin>>G.vexnum>>G.arcnum;
for(int i=1;i<=G.vexnum;i++){
cin>>G.verlist[i].data;//没有其他数据啊这题,data没啥意义的只是应付输入而已
G.verlist[i].firstarc=NULL;
}
for(int i=1;i<=G.arcnum;i++){
int x,y;cin>>x>>y;
ArcNode * p1= new ArcNode;
ArcNode * p2= new ArcNode;
p1->adjvex=y;
p1->nextarc=G.verlist[x].firstarc;
G.verlist[x].firstarc=p1;
p2->adjvex=x;
p2->nextarc=G.verlist[y].firstarc;
G.verlist[y].firstarc=p2;
}
}
void BFS(Graph G){
queue<int>Q;
bool vis[MAXN];
memset(vis,0,sizeof(vis));
cout<<"v1 ";
Q.push(1);
vis[1]=true;
while(!Q.empty()){
int u=Q.front();Q.pop();
ArcNode* p=G.verlist[u].firstarc;
while(p!=NULL){
if(!vis[p->adjvex]){
cout<<"v"<<p->adjvex<<" ";
vis[p->adjvex]=true;
Q.push(p->adjvex);
}
p=p->nextarc;
}
}
}
int main(){
Graph G;
CreateUDG(G);
BFS(G);
return 0;
}
7039
有向图DFS和打印邻接表
#include<iostream>
#include<cstring>
#include<queue>
using namespace std;
const int MAXN=105;
typedef struct ArcNode{
int adjvex;
struct ArcNode * nextarc;
}ArcNode;
typedef struct VNode{
int data;
ArcNode *firstarc;
}VNode,AdjList[MAXN];
typedef struct{
AdjList verlist;
int vexnum,arcnum;
}Graph;
void CreateUDG(Graph &G){
cin>>G.vexnum>>G.arcnum;
for(int i=1;i<=G.vexnum;i++){
cin>>G.verlist[i].data;
G.verlist[i].firstarc=NULL;
}
for(int i=1;i<=G.arcnum;i++){
int x,y;cin>>x>>y;
ArcNode * p1= new ArcNode;
p1->adjvex=y;
p1->nextarc=G.verlist[x].firstarc;
G.verlist[x].firstarc=p1;
}
}
void Print(Graph G){
for(int i=1;i<=G.vexnum;i++){
ArcNode* p=G.verlist[i].firstarc;
cout<<i<<":";
while(p!=NULL){
cout<<p->adjvex;
if(p->nextarc!=NULL)cout<<" ";
p=p->nextarc;
}
cout<<endl;
}
}
bool vis[MAXN];
void DFS(Graph G,int u){
ArcNode* p=G.verlist[u].firstarc;
vis[u]=true;
cout<<u<<" ";
while(p!=NULL){
if(!vis[p->adjvex]){
DFS(G,p->adjvex);
}
p=p->nextarc;
}
}
int main(){
Graph G;
CreateUDG(G);
Print(G);
DFS(G,1);
return 0;
}
7040
求度数相关的,写麻烦了,直接建图的时候统计就行了。可以看拓扑序列那里的建图操作。
#include<iostream>
#include<cstring>
#include<queue>
using namespace std;
const int MAXN=105;
typedef struct ArcNode{
int adjvex;
struct ArcNode * nextarc;
}ArcNode;
typedef struct VNode{
int data;
ArcNode *firstarc;
}VNode,AdjList[MAXN];
typedef struct{
AdjList verlist;
int vexnum,arcnum;
}Graph;
void CreateUDG(Graph &G){
cin>>G.vexnum>>G.arcnum;
for(int i=1;i<=G.vexnum;i++){
cin>>G.verlist[i].data;
G.verlist[i].firstarc=NULL;
}
for(int i=1;i<=G.arcnum;i++){
int x,y;cin>>x>>y;
ArcNode * p1= new ArcNode;
p1->adjvex=y;
p1->nextarc=G.verlist[x].firstarc;
G.verlist[x].firstarc=p1;
}
}
int in[MAXN],out[MAXN];
void GetInfo(Graph G){
for(int i=1;i<=G.vexnum;i++){
ArcNode* p=G.verlist[i].firstarc;
while(p!=NULL){
in[p->adjvex]++;
out[i]++;
p=p->nextarc;
}
}
}
int main(){
Graph G;
CreateUDG(G);
GetInfo(G);
for(int i=1;i<=G.vexnum;i++){
cout<<i<<":"<<in[i]<<" "<<out[i]<<" "<<in[i]+out[i]<<endl;
}
return 0;
}
7042
无向图非递归DFS
#include<iostream>
#include<cstring>
#include<stack>
using namespace std;
const int MAXN=105;
typedef struct ArcNode{
int adjvex;
struct ArcNode * nextarc;
}ArcNode;
typedef struct VNode{
int data;
ArcNode *firstarc;
}VNode,AdjList[MAXN];
typedef struct{
AdjList verlist;
int vexnum,arcnum;
}Graph;
void CreateUDG(Graph &G){
cin>>G.vexnum>>G.arcnum;
for(int i=1;i<=G.vexnum;i++){
cin>>G.verlist[i].data;
G.verlist[i].firstarc=NULL;
}
for(int i=1;i<=G.arcnum;i++){
int x,y;cin>>x>>y;
ArcNode * p1= new ArcNode;
ArcNode * p2= new ArcNode;
p1->adjvex=y;
p1->nextarc=G.verlist[x].firstarc;
G.verlist[x].firstarc=p1;
p2->adjvex=x;
p2->nextarc=G.verlist[y].firstarc;
G.verlist[y].firstarc=p2;
}
}
bool vis[MAXN];
void DFS(Graph G,int u){
stack<int>stk;
stk.push(u);vis[u]=true;
cout<<"v1 ";
while(!stk.empty()){
int tt=stk.top();
ArcNode *p=G.verlist[tt].firstarc;
while(p&&vis[p->adjvex]){
p=p->nextarc;
}
while(p&&!vis[p->adjvex]){
cout<<"v"<<p->adjvex<<" ";
vis[p->adjvex]=true;
stk.push(p->adjvex);
p=G.verlist[p->adjvex].firstarc;
}
if(p==NULL)stk.pop();
}
}
int main(){
Graph G;
CreateUDG(G);
DFS(G,1);
return 0;
}
7041
求拓扑序列,但是这玩意我感觉不是很好吧,不唯一的东西。可能你弄出来的拓扑序列也对的但是题目没加Special Judge
#include<iostream>
#include<cstring>
#include<queue>
#include<stack>
using namespace std;
const int MAXN=105;
typedef struct ArcNode{
int adjvex;
struct ArcNode * nextarc;
}ArcNode;
typedef struct VNode{
int data;
ArcNode *firstarc;
}VNode,AdjList[MAXN];
typedef struct{
AdjList verlist;
int vexnum,arcnum;
}Graph;
int deg[MAXN];
void CreateUDG(Graph &G){
cin>>G.vexnum>>G.arcnum;
for(int i=1;i<=G.vexnum;i++){
cin>>G.verlist[i].data;
G.verlist[i].firstarc=NULL;
}
for(int i=1;i<=G.arcnum;i++){
int x,y;cin>>x>>y;
deg[y]++;
ArcNode * p1= new ArcNode;
p1->adjvex=y;
p1->nextarc=G.verlist[x].firstarc;
G.verlist[x].firstarc=p1;
}
}
void TopSort(Graph G){
stack<int>s;
for(int i=1;i<=G.vexnum;i++)
if(!deg[i])s.push(i);
while(!s.empty()){
int tt=s.top();s.pop();
cout<<"v"<<tt<<" ";
ArcNode *p=G.verlist[tt].firstarc;
while(p!=NULL){
deg[p->adjvex]--;
if(deg[p->adjvex]==0)s.push(p->adjvex);
p=p->nextarc;
}
}
}
int main(){
Graph G;
CreateUDG(G);
TopSort(G);
return 0;
}
以上是关于[NEFU锐格 数据结构]实验五六 图有关的操作的主要内容,如果未能解决你的问题,请参考以下文章