#include <iostream>
#include <stdio.h>
#include <cstdio>
#include <string>
#include <string.h>
#include <math.h>
#include <algorithm>
#include <stack>
using namespace std;
#define maxSize 101
/*
//求无向图中距离顶点V最远的一个顶点 天勤P190 例7-1
typedef struct ENode //边节点
{
int adjvex;
struct ENode *next;
}ENode;
typedef struct VNode //顶点节点
{
char data;
struct ENode *firstchild;
}VNode,VNodeL[maxSize];
typedef struct Graph
{
VNodeL adjlist;
int Enum,Vnum;
}Graph;
int visited[maxSize];
void BFS(Graph g,int v) //是把顶点序号入栈!!!
{
visited[v]=1;
int queue[maxSize];
int front=1;
int rear=1;
queue[rear]=v;
rear++;
while(front!=rear)
{
v=queue[front];
front++;
ENode *s=g.adjlist[v].firstchild;
while(s)
{
if(visited[s->adjvex]==0)
{
queue[rear++]=s->adjvex;
visited[s->adjvex]=1;
}
s=s->next;
}
}
cout<<v<<endl; //队空时,v保存了遍历过程中最后一个节点
return;
}
void Create(Graph &g) //建图
{
//cout<<"输出顶点数和边数:"<<endl;
int d1,d2;
cin>>d1>>d2;
g.Vnum=d1;
g.Enum=d2;
//cout<<"输入顶点信息"<<endl;
//输入顶点信息
for(int i=0;i<g.Vnum;i++)
{
int x;
cin>>x;
g.adjlist[i].data=x;
g.adjlist[i].firstchild=NULL; //把顶点节点指向边节点的指针初始化
}
//建立边表
//cout<<"输入边(vi,vj)的下标"<<endl;
for(int i=0;i<g.Enum;i++)
{
int x,y;
cin>>x>>y;
ENode *q=(ENode*)malloc(sizeof(ENode));
q->adjvex=x;
q->next=g.adjlist[y].firstchild;
g.adjlist[y].firstchild=q;
ENode *s=(ENode*)malloc(sizeof(ENode));
s->adjvex=y;
s->next=g.adjlist[x].firstchild;
g.adjlist[x].firstchild=s;
}
}
int main()
{
Graph g;
Create(g);
for(int i=0;i<g.Vnum;i++)
{
visited[i]=0;
}
BFS(g,2);
}
5
4
0 1 2 3 4
0 2
0 3
1 2
2 4
3
*/
/*
//判断无向图G是否是一棵树 天勤P190 例7-2 需要满足条件:如果满足遍历的定点数与图的顶点数相同并且访问的边数和等于顶点数-1的两倍,则说明是树,否则不是树。
typedef struct VNode
{
char data;
struct ENode *firstchild;
}VNode,VNodeL[maxSize];
typedef struct ENode
{
int adjvex;
struct ENode *next;
}ENode;
typedef struct Graph
{
int Enum,Vnum;
VNodeL adjlist;
}Graph;
int visited[maxSize];
void DFS(Graph g,int v,int &vn,int &en)
{
visited[v]=1;
ENode *p=g.adjlist[v].firstchild;
vn++; //注意数顶点的语句的位置
while(p)
{
en++; //注意数边的语句的位置
if(visited[p->adjvex]==0)
{
DFS(g,p->adjvex,vn,en);
}
p=p->next;
}
}
int Judge(Graph g,int vn,int en)
{
if(vn==g.Vnum&&en/2==vn-1)
{
return 1;
}
else
{
return 0;
}
}
void Create(Graph &g)
{
cin>>g.Vnum>>g.Enum;
for(int i=0;i<g.Vnum;i++)
{
cin>>g.adjlist[i].data;
g.adjlist[i].firstchild=NULL;
}
for(int i=0;i<g.Enum;i++)
{
int x,y;
cin>>x>>y;
ENode *p=(ENode*)malloc(sizeof(ENode));
p->adjvex=x;
p->next=g.adjlist[y].firstchild;
g.adjlist[y].firstchild=p;
ENode *q=(ENode*)malloc(sizeof(ENode));
q->adjvex=y;
q->next=g.adjlist[x].firstchild;
g.adjlist[x].firstchild=q;
}
}
int main()
{
Graph g;
Create(g);
for(int i=0;i<g.Vnum;i++)
visited[i]=0;
int vn=0,en=0;
DFS(g,0,vn,en);
cout<<vn<<" "<<en<<endl;
int d=Judge(g,vn,en);
cout<<d<<endl;
}
5
4
0 1 2 3 4
0 3
0 2
1 2
2 4
5
5
0 1 2 3 4
0 1
0 2
0 3
1 2
2 4
*/
/*
//判断顶点i和顶点j之间是否有路径 天勤P192 例7-3
typedef struct ENode
{
int adjvex;
struct ENode *next;
}ENode;
typedef struct VNode
{
char data;
struct ENode *firstchild;
}VNode,VNodeL[maxSize];
typedef struct Graph
{
VNodeL adjlist;
int VNum,ENum;
}Graph;
int visited[maxSize];
void Create(Graph &g) //一定记得不要忘记引用号!!!
{
cin>>g.VNum>>g.ENum;
for(int i=0;i<g.VNum;i++)
{
cin>>g.adjlist[i].data;
g.adjlist[i].firstchild=NULL;
}
for(int i=0;i<g.ENum;i++)
{
int x,y;
cin>>x>>y;
ENode *p=(ENode*)malloc(sizeof(ENode));
p->adjvex=x;
p->next=g.adjlist[y].firstchild;
g.adjlist[y].firstchild=p;
ENode *q=(ENode*)malloc(sizeof(ENode));
q->adjvex=y;
q->next=g.adjlist[x].firstchild;
g.adjlist[x].firstchild=q;
}
}
int DFS(Graph g,int i,int j)
{
visited[i]=1;
ENode *s=g.adjlist[i].firstchild;
while(s)
{
if(visited[s->adjvex]==0)
{
if(s->adjvex==j)
{
return 1; //有路径
}
DFS(g,s->adjvex,j);
}
s=s->next;
}
return 0;
}
int main()
{
Graph g;
Create(g);
int i=0;
int j=3;
for(int i=0;i<g.VNum;i++)
{
visited[i]=0;
}
int d=0;
d=DFS(g,i,j);
if(visited[j]==1)
{
cout<<"有路径";
}
else
{
cout<<"不存在路径";
}
cout<<d<<endl;
}
5
5
0 1 2 3 4
0 1
0 2
0 3
1 2
2 4
5
5
0 1 2 3 4
0 1
0 2
1 2
2 4
1 4
*/
/*
//使用BFS和DFS遍历图 天勤P197 例7-5
typedef struct ENode
{
int adjvex;
struct ENode *next;
}ENode;
typedef struct VNode
{
int data;
struct ENode *firstchild;
}VNode,VNodeL[maxSize];
typedef struct Graph
{
int VNum,ENum;
VNodeL adjlist;
}Graph;
int visited[maxSize];
void Create(Graph &g)
{
cin>>g.VNum>>g.ENum;
for(int i=1;i<=g.VNum;i++)
{
cin>>g.adjlist[i].data;
g.adjlist[i].firstchild=NULL;
}
for(int i=1;i<=g.ENum;i++)
{
int x,y;
cin>>x>>y;
ENode *p=(ENode*)malloc(sizeof(ENode));
p->adjvex=x;
p->next=g.adjlist[y].firstchild;
g.adjlist[y].firstchild=p;
ENode *q=(ENode*)malloc(sizeof(ENode));
q->adjvex=y;
q->next=g.adjlist[x].firstchild;
g.adjlist[x].firstchild=q;
}
}
void BFS(Graph g,int v)
{
int queue[maxSize];
int front=1;
int rear=1;
queue[rear++]=v;
visited[v]=1;
while(front!=rear)
{
v=queue[front++];
ENode *p=g.adjlist[v].firstchild;
while(p)
{
if(visited[p->adjvex]==0)
{
visited[p->adjvex]=1;
cout<<p->adjvex<<" ";
queue[rear++]=p->adjvex;
}
p=p->next;
}
}
}
void DFS(Graph g,int v)
{
visited[v]=1;
ENode *p=g.adjlist[v].firstchild;
while(p)
{
if(visited[p->adjvex]==0)
{
visited[p->adjvex]=1;
cout<<p->adjvex<<" ";
DFS(g,p->adjvex);
}
p=p->next;
}
}
int main()
{
Graph g;
Create(g);
for(int i=1;i<=g.VNum;i++)
{
visited[i]=0;
}
cout<<1<<" ";
DFS(g,1);
cout<<endl;
for(int i=1;i<=g.VNum;i++)
{
visited[i]=0;
}
cout<<1<<" ";
BFS(g,1);
cout<<endl;
}
*/
/*
//判断有向图中是否存在vi到vj的路径 天勤P213。真题仿造1
typedef struct ENode
{
int adjvex;
struct ENode *next;
}ENode;
typedef struct VNode
{
int data;
struct ENode *firstchild;
}VNode,VNodeL[maxSize];
typedef struct Graph
{
VNodeL adjlist;
int VNum,ENum;
}Graph;
int visited[maxSize];
void Create(Graph &g)
{
cin>>g.VNum>>g.ENum;
for(int i=0;i<g.VNum;i++)
{
cin>>g.adjlist[i].data;
g.adjlist[i].firstchild=NULL;
}
for(int i=0;i<g.ENum;i++)
{
int x,y;
cin>>x>>y;
ENode *p=(ENode*)malloc(sizeof(ENode));
p->adjvex=y;
p->next=g.adjlist[x].firstchild;
g.adjlist[x].firstchild=p;
ENode *q=(ENode*)malloc(sizeof(ENode));
q->adjvex=x;
q->next=g.adjlist[y].firstchild;
g.adjlist[y].firstchild=q;
}
}
int DFS(Graph g,int i,int j)
{
visited[i]=1;
ENode *p=g.adjlist[i].firstchild;
while(p)
{
if(visited[p->adjvex]==0)
{
if(p->adjvex==j)
{
return 1;
}
visited[p->adjvex]=1;
DFS(g,p->adjvex,j);
}
p=p->next;
}
return 0;
}
int main()
{
Graph g;
Create(g);
for(int i=1;i<=g.VNum;i++)
{
visited[i]=0;
}
int x=1,y=4;
int d=DFS(g,x,y);
cout<<d<<endl;
}
*/
/*
//判断有向图中是否有根节点 真题仿造 2 天勤P213
typedef struct ENode
{
int adjvex;
struct ENode *next;
}ENode;
typedef struct VNode
{
int data;
struct ENode *firstchild;
}VNode,VNodeL[maxSize];
typedef struct Graph
{
VNodeL adjlist;
int ENum,VNum;
}Graph;
void Create(Graph &g)
{
cin>>g.VNum>>g.ENum;
for(int i=0;i<g.VNum;i++)
{
cin>>g.adjlist[i].data;
g.adjlist[i].firstchild=NULL;
}
for(int i=0;i<g.ENum;i++)
{
int x,y;
cin>>x>>y;
ENode *q=(ENode*)malloc(sizeof(ENode)); //有向图
q->adjvex=y;
q->next=g.adjlist[x].firstchild;
g.adjlist[x].firstchild=q;
}
}
int visited[maxSize];
int d;
int DFS(Graph g,int v)
{
visited[v]=1;
ENode *p=g.adjlist[v].firstchild;
d++;
while(p)
{
if(visited[p->adjvex]==0)
{
DFS(g,p->adjvex);
}
p=p->next;
}
return d;
}
int main()
{
Graph g;
Create(g);
for(int i=0;i<g.VNum;i++)
{
d=0;
for(int j=0;j<g.VNum;j++) //记得每次遍历之前要把visited数组初始化
{
visited[j]=0;
}
d=DFS(g,i);
//cout<<d<<endl;
if(d==g.VNum)
{
cout<<i<<endl;
}
}
}
3
3
0 1 2
0 1
1 2
2 0
*/
/*
//从图的邻接表转换为图的邻接矩阵。天勤P218 (7)
typedef struct ENode
{
int adjvex;
struct ENode *next;
}ENode;
typedef struct VNode
{
int data;
struct ENode *firstchild;
}VNode,VNodeL[maxSize];
typedef struct Graph
{
VNodeL adjlist;
int VNum,ENum;
}Graph;
void Create(Graph &g)
{
cin>>g.VNum>>g.ENum;
for(int i=0;i<g.VNum;i++)
{
cin>>g.adjlist[i].data;
g.adjlist[i].firstchild=NULL;
}
for(int i=0;i<g.ENum;i++)
{
int x,y;
cin>>x>>y;
ENode *p=(ENode*)malloc(sizeof(ENode));
p->adjvex=x;
p->next=g.adjlist[y].firstchild;
g.adjlist[y].firstchild=p;
ENode *q=(ENode*)malloc(sizeof(ENode));
q->adjvex=y;
q->next=g.adjlist[x].firstchild;
g.adjlist[x].firstchild=q;
}
}
void Transfer(Graph g,int matrix[][maxSize])
{
for(int i=0;i<g.VNum;i++)
{
ENode *p=g.adjlist[i].firstchild;
while(p)
{
matrix[i][p->adjvex]=1;
p=p->next;
}
}
}
int main()
{
Graph g;
Create(g);
int matrix[maxSize][maxSize];
for(int i=0;i<g.VNum;i++)
{
for(int j=0;j<g.VNum;j++)
{
matrix[i][j]=0;
}
}
Transfer(g,matrix);
for(int i=0;i<g.VNum;i++)
{
for(int j=0;j<g.VNum;j++)
{
cout<<matrix[i][j]<<" ";
}
cout<<endl;
}
}
4
3
0 1 2 3
0 1
1 2
2 3
*/
/*
//求顶点k的入度 天勤P218 (8)
typedef struct VNode
{
int data;
struct ENode *firstchild;
}VNode,VNodeL[maxSize];
typedef struct ENode
{
int adjvex;
struct ENode *next;
}ENode;
typedef struct Graph
{
VNodeL adjlist;
int VNum,ENum;
}Graph;
void Create(Graph &g)
{
cin>>g.VNum>>g.ENum;
for(int i=0;i<g.VNum;i++)
{
cin>>g.adjlist[i].data;
g.adjlist[i].firstchild=NULL;
}
for(int i=0;i<g.ENum;i++)
{
int x,y;
cin>>x>>y;
ENode *p=(ENode*)malloc(sizeof(ENode));
p->adjvex=y;
p->next=g.adjlist[x].firstchild;
g.adjlist[x].firstchild=p;
}
}
int Count(Graph g,int v,int k)
{
int d=0;
ENode *p=g.adjlist[v].firstchild;
while(p)
{
if(p->adjvex==k)
{
d++;
}
p=p->next;
}
return d;
}
int main()
{
Graph g;
Create(g);
int d=0;
int k=2;
for(int i=0;i<g.VNum;i++)
{
d+=Count(g,i,k);
}
cout<<d<<endl;
}
4
5
0 1 2 3
0 1
0 2
0 3
1 2
3 2
*/
/*
//DFS非递归算法
typedef struct ENode
{
int adjvex;
struct ENode *next;
}ENode;
typedef struct VNode
{
int data;
struct ENode *firstchild;
}VNode,VNodeL[maxSize];
typedef struct Graph
{
VNodeL adjlist;
int ENum,VNum;
}Graph;
void Create(Graph &g)
{
cin>>g.VNum>>g.ENum;
for(int i=0;i<g.VNum;i++)
{
cin>>g.adjlist[i].data;
g.adjlist[i].firstchild=NULL;
}
for(int i=0;i<g.ENum;i++)
{
int x,y;
cin>>x>>y;
ENode *p=(ENode*)malloc(sizeof(ENode));
p->adjvex=y;
p->next=g.adjlist[x].firstchild;
g.adjlist[x].firstchild=p;
}
}
int visited[maxSize];
void DFS(Graph g,int v)
{
int stack[maxSize];
int top=-1;
visited[v]=1;
stack[++top]=v;
while(top!=-1)
{
v=stack[top];
ENode *q=g.adjlist[v].firstchild;
while(q&&visited[q->adjvex]==1)
{
q=q->next;
}
if(q==NULL) //若q到达链表尾部,说明当前顶点的所有点都访问完毕,当前顶点出栈
--top;
else //否则访问当前邻接点并入栈
{
cout<<q->adjvex<<" ";
visited[q->adjvex]=1;
stack[++top]=q->adjvex;
}
}
}
int main()
{
Graph g;
Create(g);
for(int i=0;i<g.VNum;i++)
visited[i]=0;
cout<<0<<" ";
DFS(g,0);
}
6
6
0 1 2 3 4 5
0 4
4 3
3 5
3 2
2 1
1 0
0 4 3 2 1 5
*/
//计算全省畅通需要的最低成本 最小生成树 P天勤218 2 (1)