实现图的存储结构(简易版)
#include <iostream>
using namespace std;
int g[100][100];
int main()
{
int n,m;
cin >> n >> m;
for (int i = 0; i < m; i++)
{
int a, b;
cin >> a >> b;
g[a][b] = 1;
}
for (int i = 1; i <= n; i++)
{
for (int j = 1; j <= n; j++)
{
cout << g[i][j] << " ";
}
cout << endl;
}
return 0;
}
图的深度遍历
#include"string.h"
#include"malloc.h"
#include"stdio.h"
#include"stdlib.h"
typedef int InfoType;
#define MAX_NAME 3
typedef char VertexType[MAX_NAME];
#define MAX_VERTEX_NUM 20
typedef enum { DG, DN, AG, AN }GraphKind;
typedef struct ArcNode
{
int adjvex;
struct ArcNode* nextarc;
InfoType* info;
}ArcNode;
typedef struct
{
VertexType data;
ArcNode* firstarc;
}VNode, AdjList[MAX_VERTEX_NUM];
typedef struct
{
AdjList vertices;
int vexnum, arcnum;
int kind;
}ALGraph;
int LocateVex(ALGraph G, VertexType u)
{
int i;
for (i = 0; i < G.vexnum; ++i)
if (strcmp(u, G.vertices[i].data) == 0)
return i;
return -1;
}
void CreateGraph(ALGraph* G)
{
int i, j, k;
int w;
VertexType va, vb;
ArcNode* p;
scanf("%d", &(*G).kind);
scanf("%d%d", &(*G).vexnum, &(*G).arcnum);
for (i = 0; i < (*G).vexnum; ++i)
{
scanf("%s", (*G).vertices[i].data);
(*G).vertices[i].firstarc = NULL;
}
for (k = 0; k < (*G).arcnum; ++k)
{
if ((*G).kind == 1 || (*G).kind == 3)
scanf("%d%s%s", &w, va, vb);
else
scanf("%s%s", va, vb);
i = LocateVex(*G, va);
j = LocateVex(*G, vb);
p = (ArcNode*)malloc(sizeof(ArcNode));
p->adjvex = j;
if ((*G).kind == 1 || (*G).kind == 3)
{
p->info = (int*)malloc(sizeof(int));
*(p->info) = w;
}
else
p->info = NULL;
p->nextarc = (*G).vertices[i].firstarc;
(*G).vertices[i].firstarc = p;
if ((*G).kind >= 2)
{
p = (ArcNode*)malloc(sizeof(ArcNode));
p->adjvex = i;
if ((*G).kind == 3)
{
p->info = (int*)malloc(sizeof(int));
*(p->info) = w;
}
else
p->info = NULL;
p->nextarc = (*G).vertices[j].firstarc;
(*G).vertices[j].firstarc = p;
}
}
}
VertexType* GetVex(ALGraph G, int v)
{
if (v >= G.vexnum || v < 0)
exit(0);
return &G.vertices[v].data;
}
int FirstAdjVex(ALGraph G, VertexType v)
{
ArcNode* p;
int v1;
v1 = LocateVex(G, v);
p = G.vertices[v1].firstarc;
if (p)
return p->adjvex;
else
return -1;
}
int NextAdjVex(ALGraph G, VertexType v, VertexType w)
{
ArcNode* p;
int v1, w1;
v1 = LocateVex(G, v);
w1 = LocateVex(G, w);
p = G.vertices[v1].firstarc;
while (p && p->adjvex != w1)
p = p->nextarc;
if (!p || !p->nextarc)
return -1;
else
return p->nextarc->adjvex;
}
int visited[MAX_VERTEX_NUM];
void(*VisitFunc)(char* v);
void DFS(ALGraph G, int v)
{
visited[v] = 1;
VisitFunc(G.vertices[v].data);
for (int w = FirstAdjVex(G, G.vertices[v].data); w >= 0; w = NextAdjVex(G, G.vertices[v].data, G.vertices[w].data))
if (!visited[w]) DFS(G, w);
}
void DFSTraverse(ALGraph G,void(*Visit)(char*))
{
int v;
VisitFunc = Visit;
memset(visited, 0, sizeof(visited));
for (v = 0; v < G.vexnum; v++)
if (!visited[v]) DFS(G, v);
printf("\n");
}
void print(char* i)
{
printf("%s ", i);
}
int main()
{
ALGraph g;
CreateGraph(&g);
DFSTraverse(g,print);
return 1;
}
图的广度遍历
#include <iostream>
#include <vector>
#include <queue>
using namespace std;
vector<char>e[105];
int vis[105];
void bfs(int cur)
{
int i;
queue<char>q;
q.push(e[cur][0]);
vis[cur]=1;
while(q.size()>0)
{
cur=q.front()-'a';
cout<<e[cur][0]<<" ";
for(i=1; i<e[cur].size(); i++)
{
int x=e[cur][i]-'a';
if(vis[x]==0)
{
q.push(e[cur][i]);
vis[x]=1;
}
}
if(q.size())
q.pop();
}
}
int main()
{
int i,n,m,x,y,w,choice=0,p=0,first=0;
char a,b,ch;
cin>>choice>>n>>m;
getchar();
for(i=1; i<=n; i++)
{
cin>>ch;
getchar();
p=ch-'a';
if(i==1)
first=p;
e[p].push_back(ch);
}
if(choice<2)
{
if(choice%2)
{
for(i=1; i<=m; i++)
{
cin>>a>>b>>w;
getchar();
x=a-'a';
if(e[x].size()==1)
e[x].push_back(b);
else
e[x].insert(e[x].begin()+1,b);
}
}
else
{
for(i=1; i<=m; i++)
{
cin>>a>>b;
getchar();
x=a-'a';
if(e[x].size()==1)
e[x].push_back(b);
else
e[x].insert(e[x].begin()+1,b);
}
}
}
else
{
if(choice%2)
{
for(i=1; i<=m; i++)
{
cin>>a>>b>>w;
getchar();
x=a-'a';
y=b-'a';
if(e[x].size()==1)
e[x].push_back(b);
else
e[x].insert(e[x].begin()+1,b);
if(e[y].size()==1)
e[y].push_back(a);
else
e[y].insert(e[y].begin()+1,a);
}
}
else
{
for(i=1; i<=m; i++)
{
cin>>a>>b;
getchar();
x=a-'a';
y=b-'a';
if(e[x].size()==1)
e[x].push_back(b);
else
e[x].insert(e[x].begin()+1,b);
if(e[y].size()==1)
e[y].push_back(a);
else
e[y].insert(e[y].begin()+1,a);
}
}
}
bfs(first);
for(i=0; i<n; i++)
{
if(vis[i]==0)
bfs(i);
}
return 0;
}