BFS
#include<stdio.h>
#include<stdlib.h>
#define maxsize 100
#define INF 0x777777
typedef struct ArcNode{
int vex;
struct ArcNode *next;
}ArcNode;
typedef struct VNode{
int data;
ArcNode *first;
}VNode,AdjList;
typedef struct{
AdjList vertices[maxsize];
int vexnum,arcnum;
}ALGraph;
void visit(int v)
{
}
void BFS(ALGraph G,int v)
{
int visited[maxsize];
for(int i=0;i<G.vexnum;i++)
visited[i]=0;
int queue[maxsize];
int front,rear;
int w,u;
front=rear=0;
visit(v);
visited[v]=1;
queue[rear]=v;
rear=(rear+1)%maxsize;
while(front!=rear)
{
u=queue[front];
front=(front+1)%maxsize;
w=GetFirstVex(G,u);
while(w>=0)
{
if(visited[w]==0)
{
visit(w);
visited[w]=1;
queue[rear]=w;
rear=(rear+1)%maxsize;
}
w=GetNextVex(G,u,w);
}
}
}
DFS
int visited[maxsize];
void DFS(Graph G,int v)
{
visit(v);
visited[v]=1;
int w;
for(w=FirstNeighbor(G,v);w>=0;w=NextNeighbor(G,v,w))
if(visited[w]==0)
{
DFS(G,w);
}
}
void DFS(graph g,int v)
{
visit(v);
visited[v] = 1;
for (int j = 0; j < g.n; j++)
{
if (g.edges[v][j] == 1 && visited[j] == 0)
{
DFS(g,j);
}
}
}
拓扑排序
bool TopologicalSort(Graph G){
InitStack(S);
for(int i=0;i<G.vexnum;i++)
if(indegree[i]==0)
Push(S,i);
int count=0;
while(!IsEmpty(S)){
Pop(S,i);
printf("%d ",i);
count++;
for(p=G.vertices[i].firstarc;p;p=p->nextarc)
{
v=p->adjvex;
if((--indegree[v])==0)
{
Push(S,v);
}
}
}
if(count<G.vexnum)
return false;
else
return true;
}
bool Topo(graph g)
{
int stack[maxsize];
int top=-1;
int indegree[maxsize];
countIndegree(g,indegree);
for(int i=0;i<g.n;i++)
if(indegree[i]==0)
stack[++top]=i;
int count=0;
while(top>=0)
{
int i=stack[top--];
count++;
for(int j=0;j<g.n;j++)
if(g.edges[i][j]==1)
{
indegree[j]--;
if(indegree[j]==0)
stack[++top]=j;
}
}
if(count<g.n)
return false;
else
return true;
}
void countIndegree(graph g,int indegree[])
{
memset(indegree,0,sizeof(indegree));
for(int i=0;i<g.n;i++)
for(int j=0;j<g.n;j++)
if(g.edges[j][i]==1)
indegree[i]++;
}
Dijkstra
void Dijkstra(Graph g,int v,int dist[],int path[])
{
int visited[maxsize];
int min,i,j,k;
for(i=0;i<g.n;i++)
{
dist[i]=g.edges[v][i];
visited[i]=0;
if(g.edges[v][i]<INF)
path[i]=v;
else
path[i]=-1;
}
visited[v]=1;
path[v]=-1;
for(i=0;i<g.n-1;i++)
{
min=INF;
for(j=0;j<g.n;j++)
if(visited[j]==0&&dist[j]<min)
{
k=j;
min=dist[j];
}
visited[k]=1;
for(j=0;j<g.n;j++)
{
if(visited[j]==0&&dist[k]+g.edges[k][j]<dist[j])
{
dist[j]=dist[k]+g.edges[k][j];
path[j]=k;
}
}
}
}
BFS求无权图的单源最短路径
typedef struct graph
{
int edges[maxsize][maxsize];
int n,e;
}graph;
void BFS_MIN_Distance(graph g,int v,int dist[])
{
int visit[maxsize]={0};
for(int i=0;i<g.n;i++)
dist[i]=-1;
visit[v]=1;
dist[v]=0;
int queue[maxsize];
int front=0,rear=0;
queue[rear++]=v;
while(front!=rear)
{
int p=queue[front++];
for(int i=0;i<g.n;i++)
if(visit[i]==0&&g.edges[p][i]==1)
{
visit[i]=1;
dist[i]=dist[p]+1;
queue[rear++]=i;
}
}
}
Floyd
void Floyd(Graph *g,int path[][maxsize],int a[][maxsize])
{
int i,j,k;
for(i=0;i<g->n;i++)
for(j=0;j<g->n;j++)
{
a[i][j]=g->edges[i][j];
path[i][j]=-1;
}
for(k=0;k<g->n;k++)
for(i=0;i<g->n;i++)
for(j=0;j<g->n;j++)
if(a[i][j]>a[i][k]+a[k][j])
{
a[i][j]=a[i][k]+a[k][j];
path[i][j]=k;
}
}
Prim
/void Prim(graph g,int v,int &sum)
{
int visit[maxsize]={0};
int dist[maxsize];
for(int i=0;i<g.n;i++)
dist[i]=g.edges[v][i];
visit[v]=1;
int sum=0;
for(int i=0;i<g.n-1;i++)
{
int min=maxsize;
int k;
for(int j=0;j<g.n;j++)
{
if(visit[j]==0&&dist[j]<min)
{
min=dist[j];
k=j;
}
}
visit[k]=1;
sum+=min;
for(int j=0;j<g.n;j++)
if(visit[j]==0&&g.edges[k][j]<dist[j])
dist[j]=g.edges[k][j];
}
}