基于邻接矩阵的新顶点的增加
#include<iostream>
using namespace std;
#define MAXVNUM 100
typedef struct{
int vexsNum;
int arcsNum;
int arcs[MAXVNUM][MAXVNUM];
int vexs[MAXVNUM];
}AdjMatrixG;
void InitGraph(AdjMatrixG &G){
for(int k=0;k<MAXVNUM;k++)
G.vexs[k]=k;
for(int i=0;i<MAXVNUM;i++){
for(int j=0;j<MAXVNUM;j++)
G.arcs[i][j]=0;
}
}
void CreateGraph(AdjMatrixG &G){
cin>>G.vexsNum>>G.arcsNum;
if(G.vexsNum==0 && G.arcsNum==0)return;
for(int i=1;i<=G.vexsNum;i++){
G.arcs[0][i]=G.vexs[i];
G.arcs[i][0]=G.vexs[i];
}
for(int i=0;i<G.arcsNum;i++){
int a,b;
cin>>a>>b;
G.arcs[a][b]=G.arcs[b][a]=1;
}
}
void InsertGraph(AdjMatrixG &G){
int v;cin>>v;
G.vexsNum++;
G.arcs[0][G.vexsNum]=G.vexs[v];
G.arcs[G.vexsNum][0]=G.vexs[v];
}
void PrintGraph(AdjMatrixG G){
for(int i=0;i<=G.vexsNum;i++){
for(int j=0;j<=G.vexsNum;j++){
cout<<G.arcs[i][j];
if(j!=G.vexsNum)cout<<" ";
}
cout<<endl;
}
}
int main(){
while(true){
AdjMatrixG G;
InitGraph(G);
CreateGraph(G);
if(G.vexsNum==0&&G.arcsNum==0)break;
InsertGraph(G);
PrintGraph(G);
}
}
基于邻接矩阵的新边的增加
#include<iostream>
using namespace std;
#define MAXVNUM 100
typedef struct{
int vexsNum;
int arcsNum;
int arcs[MAXVNUM][MAXVNUM];
int vexs[MAXVNUM];
}AdjMatrixG;
void InitGraph(AdjMatrixG &G){
for(int k=0;k<MAXVNUM;k++)
G.vexs[k]=k;
for(int i=0;i<MAXVNUM;i++){
for(int j=0;j<MAXVNUM;j++)
G.arcs[i][j]=0;
}
}
void CreateGraph(AdjMatrixG &G){
cin>>G.vexsNum>>G.arcsNum;
if(G.vexsNum==0 && G.arcsNum==0)return;
for(int i=1;i<=G.vexsNum;i++){
G.arcs[0][i]=G.vexs[i];
G.arcs[i][0]=G.vexs[i];
}
for(int i=0;i<G.arcsNum;i++){
int a,b;
cin>>a>>b;
G.arcs[a][b]=G.arcs[b][a]=1;
}
}
void InsertGraph(AdjMatrixG &G){
int a,b;
cin>>a>>b;
G.arcs[a][b]=G.arcs[b][a]=1;
}
void PrintGraph(AdjMatrixG G){
for(int i=0;i<=G.vexsNum;i++){
for(int j=0;j<=G.vexsNum;j++){
cout<<G.arcs[i][j];
if(j!=G.vexsNum)cout<<" ";
}
cout<<endl;
}
}
int main(){
while(true){
AdjMatrixG G;
InitGraph(G);
CreateGraph(G);
if(G.vexsNum==0&&G.arcsNum==0)break;
InsertGraph(G);
PrintGraph(G);
}
}
基于邻接矩阵的边的删除
#include<iostream>
using namespace std;
#define MAXVNUM 100
typedef struct{
int vexsNum;
int arcsNum;
int arcs[MAXVNUM][MAXVNUM];
int vexs[MAXVNUM];
}AdjMatrixG;
void InitGraph(AdjMatrixG &G){
for(int k=0;k<MAXVNUM;k++)
G.vexs[k]=k;
for(int i=0;i<MAXVNUM;i++){
for(int j=0;j<MAXVNUM;j++)
G.arcs[i][j]=0;
}
}
void CreateGraph(AdjMatrixG &G){
cin>>G.vexsNum>>G.arcsNum;
if(G.vexsNum==0 && G.arcsNum==0)return;
for(int i=1;i<=G.vexsNum;i++){
G.arcs[0][i]=G.vexs[i];
G.arcs[i][0]=G.vexs[i];
}
for(int i=0;i<G.arcsNum;i++){
int a,b;
cin>>a>>b;
G.arcs[a][b]=G.arcs[b][a]=1;
}
}
void DeleteGraph(AdjMatrixG &G){
int a,b;
cin>>a>>b;
G.arcs[a][b]=G.arcs[b][a]=0;
G.arcsNum--;
}
void PrintGraph(AdjMatrixG G){
for(int i=0;i<=G.vexsNum;i++){
for(int j=0;j<=G.vexsNum;j++){
cout<<G.arcs[i][j];
if(j!=G.vexsNum)cout<<" ";
}
cout<<endl;
}
}
int main(){
while(true){
AdjMatrixG G;
InitGraph(G);
CreateGraph(G);
if(G.vexsNum==0&&G.arcsNum==0)break;
DeleteGraph(G);
PrintGraph(G);
}
}
基于邻接矩阵的顶点的删除
#include<iostream>
using namespace std;
#define MAXVNUM 100
typedef struct{
int vexsNum;
int arcsNum;
int arcs[MAXVNUM][MAXVNUM];
int vexs[MAXVNUM];
}AdjMatrixG;
void InitGraph(AdjMatrixG &G){
for(int k=0;k<MAXVNUM;k++)
G.vexs[k]=k;
for(int i=0;i<MAXVNUM;i++){
for(int j=0;j<MAXVNUM;j++)
G.arcs[i][j]=0;
}
}
void CreateGraph(AdjMatrixG &G){
cin>>G.vexsNum>>G.arcsNum;
if(G.vexsNum==0 && G.arcsNum==0)return;
for(int i=1;i<=G.vexsNum;i++){
G.arcs[0][i]=G.vexs[i];
G.arcs[i][0]=G.vexs[i];
}
for(int i=0;i<G.arcsNum;i++){
int a,b;
cin>>a>>b;
G.arcs[a][b]=G.arcs[b][a]=1;
}
}
void DeleteGraph(AdjMatrixG &G){
int v;
cin>>v;
for(int i=v;i<=G.vexsNum;i++){
G.arcs[0][i]=G.arcs[0][i+1];
G.arcs[i][0]=G.arcs[i+1][0];
}
G.vexsNum--;
}
void PrintGraph(AdjMatrixG G){
for(int i=0;i<=G.vexsNum;i++){
for(int j=0;j<=G.vexsNum;j++){
cout<<G.arcs[i][j];
if(j!=G.vexsNum)cout<<" ";
}
cout<<endl;
}
}
int main(){
while(true){
AdjMatrixG G;
InitGraph(G);
CreateGraph(G);
if(G.vexsNum==0&&G.arcsNum==0)break;
DeleteGraph(G);
PrintGraph(G);
}
}
【总结-----邻接矩阵的结构体】
——————————以下是邻接表相关的题目————————————
【总结-----邻接表的结构体】
基于邻接表的新结点的增加
#include<iostream>
using namespace std;
#define MAXVNUM 100
//定义顶点结构体
typedef struct VNode{
int data;
struct VNode *next;
}VNode,*NodeList;
//定义邻接表结构体
typedef struct{
NodeList V[MAXVNUM]; //顶点数组
int vexNum,arcNum;
}AdjList;
void CreateGraph(AdjList &G,int vexNum,int arcNum){
G.vexNum=vexNum;
G.arcNum=arcNum;
//初始化工作
for(int i=1;i<=G.vexNum;i++){
G.V[i]=new VNode;
G.V[i]->next=NULL;
G.V[i]->data=i;
}
for(int i=0;i<G.arcNum;i++){
int v1,v2;
cin>>v1>>v2;
NodeList p1=new VNode;
p1->data=v2;
//头插法
p1->next=G.V[v1]->next;
G.V[v1]->next=p1;
NodeList p2=new VNode;
p2->data=v1;
p2->next=G.V[v2]->next;
G.V[v2]->next=p2;
}
}
//添加顶点
void InsertVex(AdjList &G){
int data;
cin>>data;
G.vexNum++;
G.V[G.vexNum]=new VNode;
G.V[G.vexNum]->data=data;
G.V[G.vexNum]->next=NULL;
}
void PrintGraph(AdjList G){
for(int i=1;i<=G.vexNum;i++){
NodeList p=G.V[i];
while(p->next){
cout<<p->data<<" ";
p=p->next;
}
cout<<p->data;
cout<<endl;
}
}
int main(){
int vexNum,arcNum;
cin>>vexNum>>arcNum;
while(vexNum!=0 && arcNum!=0){
AdjList G;
CreateGraph(G,vexNum,arcNum);
InsertVex(G);
PrintGraph(G);
cin>>vexNum>>arcNum;
}
}
删除结点
#include<iostream>
using namespace std;
#define MAXVNUM 100
typedef struct VNode{
int data;
struct VNode *next;
}VNode,*NodeList;
typedef struct{
NodeList V[MAXVNUM];
int vexNum,arcNum;
}AdjList;
void CreateGraph(AdjList &G){
//对邻接表里的顶点结点数组初始化
for(int i=1;i<=G.vexNum;i++){
G.V[i]=new VNode;
G.V[i]->data=i;
G.V[i]->next=NULL;
}
for(int j=0;j<G.arcNum;j++){
int v0,v1;
cin>>v0>>v1; //输入一条边
NodeList p1=new VNode;p1->next=NULL;
p1->data=v1;
p1->next=G.V[v0]->next;
G.V[v0]->next=p1;
NodeList p2=new VNode;p2->next=NULL;
p2->data=v0;
p2->next=G.V[v1]->next;
G.V[v1]->next=p2;
//完成这条边的插入
}
}
void DeleteVex(AdjList &G){
int v;
cin>>v;
for(int i=v;i<G.vexNum;i++){
//移动数组后边的
G.V[i]=G.V[i+1];
}
for(int j=1;j<G.vexNum;j++){
NodeList pre=G.V[j];
NodeList p=G.V[j]->next;
while(p){
if(p->data==v){
pre->next=p->next;
G.arcNum--;
}
pre=p;
p=p->next;
}
}
G.vexNum--;
}
void PrintGraph(AdjList G){
for(int i=1;i<=G.vexNum;i++){
NodeList p=G.V[i];
while(p->next){
cout<<p->data<<" ";
p=p->next;
}
cout<<p->data;
cout<<endl;
}
}
int main(){
AdjList G;
cin>>G.vexNum>>G.arcNum; //输入顶点和边数
while(G.arcNum!=0 && G.vexNum!=0){
CreateGraph(G);
DeleteVex(G);
PrintGraph(G);
cin>>G.vexNum>>G.arcNum;
}
}
基于邻接表添加边
#include<iostream>
using namespace std;
#define MAXVNUM 100
typedef struct VNode{
int data;
struct VNode *next;
}VNode,*NodeList;
typedef struct{
NodeList V[MAXVNUM];
int vexNum,arcNum;
}AdjList;
void CreateGraph(AdjList &G){
//对邻接表里的顶点结点数组初始化
for(int i=1;i<=G.vexNum;i++){
G.V[i]=new VNode;
G.V[i]->data=i;
G.V[i]->next=NULL;
}
for(int j=0;j<G.arcNum;j++){
int v0,v1;
cin>>v0>>v1; //输入一条边
NodeList p1=new VNode;p1->next=NULL;
p1->data=v1;
p1->next=G.V[v0]->next;
G.V[v0]->next=p1;
NodeList p2=new VNode;p2->next=NULL;
p2->data=v0;
p2->next=G.V[v1]->next;
G.V[v1]->next=p2;
//完成这条边的插入
}
}
void DeleteVex(AdjList &G){
int v;
cin>>v;
for(int i=v;i<G.vexNum;i++){
//移动数组后边的
G.V[i]=G.V[i+1];
}
for(int j=1;j<G.vexNum;j++){
NodeList pre=G.V[j];
NodeList p=G.V[j]->next;
while(p){
if(p->data==v){
pre->next=p->next;
G.arcNum--;
}
pre=p;
p=p->next;
}
}
G.vexNum--;
}
void InsertArc(AdjList &G){
int v0,v1;
cin>>v0>>v1;
G.arcNum++;
NodeList V0=new VNode;V0->next=NULL;
V0->data=v0;
V0->next=G.V[v1]->next;
G.V[v1]->next=V0;
NodeList V1=new VNode;V1->next=NULL;
V1->data=v1;
V1->next=G.V[v0]->next;
G.V[v0]->next=V1;
}
void PrintGraph(AdjList G){
for(int i=1;i<=G.vexNum;i++){
NodeList p=G.V[i];
while(p->next){
cout<<p->data<<" ";
p=p->next;
}
cout<<p->data;
cout<<endl;
}
}
int main(){
AdjList G;
cin>>G.vexNum>>G.arcNum; //输入顶点和边数
while(G.arcNum!=0 && G.vexNum!=0){
CreateGraph(G);
InsertArc(G);
PrintGraph(G);
cin>>G.vexNum>>G.arcNum;
}
}
基于邻接表删除边
#include<iostream>
using namespace std;
#define MAXVNUM 100
typedef struct VNode{
int data;
struct VNode *next;
}VNode,*NodeList;
typedef struct{
NodeList V[MAXVNUM];
int vexNum,arcNum;
}AdjList;
void CreateGraph(AdjList &G){
//对邻接表里的顶点结点数组初始化
for(int i=1;i<=G.vexNum;i++){
G.V[i]=new VNode;
G.V[i]->data=i;
G.V[i]->next=NULL;
}
for(int j=0;j<G.arcNum;j++){
int v0,v1;
cin>>v0>>v1; //输入一条边
NodeList p1=new VNode;p1->next=NULL;
p1->data=v1;
p1->next=G.V[v0]->next;
G.V[v0]->next=p1;
NodeList p2=new VNode;p2->next=NULL;
p2->data=v0;
p2->next=G.V[v1]->next;
G.V[v1]->next=p2;
//完成这条边的插入
}
}
void DeleteVex(AdjList &G){
int v;
cin>>v;
for(int i=v;i<G.vexNum;i++){
//移动数组后边的
G.V[i]=G.V[i+1];
}
for(int j=1;j<G.vexNum;j++){
NodeList pre=G.V[j];
NodeList p=G.V[j]->next;
while(p){
if(p->data==v){
pre->next=p->next;
G.arcNum--;
}
pre=p;
p=p->next;
}
}
G.vexNum--;
}
void InsertArc(AdjList &G){
int v0,v1;
cin>>v0>>v1;
G.arcNum++;
NodeList V0=new VNode;V0->next=NULL;
V0->data=v0;
V0->next=G.V[v1]->next;
G.V[v1]->next=V0;
NodeList V1=new VNode;V1->next=NULL;
V1->data=v1;
V1->next=G.V[v0]->next;
G.V[v0]->next=V1;
}
void DeleteArc(AdjList &G){
int v0,v1;
cin>>v0>>v1;
G.arcNum--;
NodeList pre=G.V[v0];
NodeList p=G.V[v0]->next;
while(p){
if(p->data==v1){
pre->next=p->next;
}
pre=pre->next;
p=p->next;
}
pre=G.V[v1];
p=G.V[v1]->next;
while(p){
if(p->data==v0){
pre->next=p->next;
}
pre=pre->next;
p=p->next;
}
}
void PrintGraph(AdjList G){
for(int i=1;i<=G.vexNum;i++){
NodeList p=G.V[i];
while(p->next){
cout<<p->data<<" ";
p=p->next;
}
cout<<p->data;
cout<<endl;
}
}
int main(){
AdjList G;
cin>>G.vexNum>>G.arcNum; //输入顶点和边数
while(G.arcNum!=0 && G.vexNum!=0){
CreateGraph(G);
DeleteArc(G);
PrintGraph(G);
cin>>G.vexNum>>G.arcNum;
}
}
基于邻接表的深度遍历
【总结】并没有定义额外的数据结构,而是巧妙地定义了一个Stack数组和top指针。每访问到一个点就入栈,然后出栈,找到最后一个邻接点,把那个点入栈
1.每次入栈之时==访问到它了,cout
2.记得用vis数组标记每个点是否被访问过
#include<iostream>
using namespace std;
#define MAXVNUM 100
typedef struct VNode{
int data;
struct VNode *next;
}VNode,*NodeList;
typedef struct{
NodeList V[MAXVNUM];
int vexNum,arcNum;
}AdjList;
void CreateGraph(AdjList &G){
//对邻接表里的顶点结点数组初始化
for(int i=1;i<=G.vexNum;i++){
G.V[i]=new VNode;
G.V[i]->data=i;
G.V[i]->next=NULL;
}
for(int j=0;j<G.arcNum;j++){
int v0,v1;
cin>>v0>>v1; //输入一条边
NodeList p1=new VNode;p1->next=NULL;
p1->data=v1;
p1->next=G.V[v0]->next;
G.V[v0]->next=p1;
NodeList p2=new VNode;p2->next=NULL;
p2->data=v0;
p2->next=G.V[v1]->next;
G.V[v1]->next=p2;
//完成这条边的插入
}
}
bool sign[MAXVNUM]; //用来标记每个顶点是否被访问过
void DFS(AdjList G,int v){
int top=0;
int vis[MAXVNUM],Stack[MAXVNUM];
for(int i=0;i<=G.vexNum;i++)
vis[i]=0;//一开始所有点都未访问
//访问到v
cout<<v;//一遇到这个点就输出这个点
Stack[top]=v;
top++;
vis[v]=1;
while(top>0){
int flag=0;
NodeList p=G.V[Stack[top-1]];
while(p){
if(!vis[p->data]){
flag=p->data;
}
p=p->next;
}
//通过以上循环,找到了栈顶元素的第一个没访问过的邻接点
if(flag==0)top--; //没找到邻接点,top--就相当于出栈v了
else{
cout<<" "<<flag;
Stack[top]=flag;
vis[flag]=1;
}
}
cout<<endl;
}
void PrintGraph(AdjList G){
for(int i=1;i<=G.vexNum;i++){
NodeList p=G.V[i];
while(p->next){
cout<<p->data<<" ";
p=p->next;
}
cout<<p->data;
cout<<endl;
}
}
int main(){
AdjList G;
cin>>G.vexNum>>G.arcNum; //输入顶点和边数
while(G.arcNum!=0 && G.vexNum!=0){
CreateGraph(G);
int v;cin>>v;
DFS(G,v);
cin>>G.vexNum>>G.arcNum;
}
}
最长的最短路径的求解【一定要结合3.21的迪杰斯特拉熟练一点!!】
#include<iostream>
using namespace std;
#define MVNUM 100
#define MaxInt 999
typedef struct{
int arcNum;
int vexNum;
int arc[MVNUM][MVNUM];
int vex[MVNUM];
}Graph;
void InitGraph(Graph &G){
for(int i=0;i<MVNUM;i++)
G.vex[i]=i+1; //0下标处存的顶点名叫1这样
for(int i=1;i<=MVNUM;i++){
for(int j=1;j<=MVNUM;j++){
G.arc[i-1][j-1]=MaxInt;
G.arc[i-1][i-1]=0; //到自己的距离是0
}
}
}
void CreateGraph(Graph &G){
//输入边
for(int cnt=0;cnt<G.arcNum;cnt++){
int v0,v1;
int w;
cin>>v0>>v1>>w;
G.arc[v0-1][v1-1]=G.arc[v1-1][v0-1]=w;
}
}
void Dijkstra(Graph G){
int S[G.vexNum]; //只有 0(不在S集合) 1(在S集合)两个值
int D[G.vexNum];
int v;cin>>v;
//对S和D进行初始化
for(int i=1;i<=G.vexNum;i++){
S[i-1]=0;
D[i-1]=G.arc[i-1][v-1];
}
S[v-1]=1;
D[v-1]=0;
//要找剩下n-1个结点到v的最短路径
for(int i=0;i<G.vexNum-1;i++){
int nowMin=MaxInt;//找到这一遍遍历的最短路径
int w=0;//找到离v最近的点w
for(int j=1;j<=G.vexNum;j++){
if(!S[j-1] && D[j-1]<nowMin){
w=j;
nowMin=D[j-1];
}
}
S[w-1]=1;
for(int j=1;j<=G.vexNum;j++){
if(!S[j-1] && D[w-1]+G.arc[w-1][j-1]<D[j-1]){
D[j-1]=D[w-1]+G.arc[w-1][j-1];
}
}
}
int myMax=0; int myV=0;
for(int i=1;i<=G.vexNum;i++){
if(D[i-1]>myMax){
myMax=D[i-1];
myV=i;
}
}
cout<<myV<<endl;
cout<<myMax<<endl;
}
void Show(Graph G){
for(int i=1;i<=G.vexNum;i++){
for(int j=1;j<=G.vexNum;j++)
cout<<G.arc[i][j]<<" ";
cout<<endl;
}
}
int main(){
while(true){
Graph G;
InitGraph(G);
cin>>G.vexNum>>G.arcNum;
if(G.arcNum ==0 && G.vexNum==0)break;
CreateGraph(G);
Dijkstra(G);
}
return 0;
}