1 solutions
-
0
C :
#include<stdio.h> #include<stdlib.h> #define MAXVEX 60 typedef int WeightType; typedef int Elemtype; typedef struct EdgeNode { int adjvex; int data; WeightType weight; struct EdgeNode *next; }EdgeNode; typedef struct VexNode { EdgeNode *firstarc; }VexNode, AdjList[MAXVEX]; typedef struct GraphADJ{ AdjList adjlist; int numvex, numedge; }GraphADJ; void InitGraph(GraphADJ *G,int n) { int i; G->numvex = n; for(i=0; i<n; i++) { G->adjlist[i].firstarc= NULL; } } void InsertEdge(GraphADJ *G,int s,int t,int w) { EdgeNode *newn = (EdgeNode *)malloc(sizeof(EdgeNode)); newn->adjvex = t; newn->weight = w; newn->next=G->adjlist[s].firstarc; G->adjlist[s].firstarc=newn; } int LocateEdge(GraphADJ G,int s,int t) { EdgeNode *p = G.adjlist[s].firstarc; while(p!=NULL) { if(p->adjvex == t) return 0; p = p->next; } return 1; } void Create(GraphADJ *G,int n) { int i,j,x,k=0,t; int a[60][60],visit[60],b[60]; InitGraph(G,n); for(i=0;i<n;i++) visit[i]=0; for(i=0;i<n;i++) for(j=0;j<n;j++) scanf("%d",&a[i][j]); for(i=0;i<n;i++) for(j=n-1;j>=0;j--) { if(a[i][j]==1) InsertEdge(G,i,j,1); } EdgeNode *p; i=0; while(k==0) { j=0,t=0; printf("%d ",i); do { p=G->adjlist[i].firstarc; visit[i]=1; while(p!=NULL) { i=p->adjvex; if(visit[i]!=1) { b[j++]=i; visit[i]=1; printf("%d ",i); } p=p->next; } i=b[t]; b[t]=-1; t++; }while(t<=j); for(i=0;i<n;i++) { if(visit[i]==1) k=1; else { k=0; break; } } } } void main() { int n; scanf("%d",&n); GraphADJ G; Create(&G,n); printf("\n"); }
C++ :
#include <stdio.h> #include <stdlib.h> #include <string.h> #include <limits.h> #define OK 1 #define ERROR 0 #define TRUE 1 #define FALSE 0 #define OVERFLOW -1 typedef int Status; /* 函数结果状态代码,如OK等 */ #define INFINITY INT_MAX /* 用整型最大值代替∞ */ #define MAX_VERTEX_NUM 50 /* 最大顶点个数 */ typedef int VRType; typedef char InfoType; typedef int VertexType; typedef VRType QElemType; /* 队列类型 */ typedef enum{DG,DN,AG,AN}GraphKind; /* {有向图,有向网,无向图,无向网} */ typedef struct { VRType adj; /* 顶点关系类型。对无权图,用1(是)或0(否)表示相邻否; */ /* 对带权图,c则为权值类型 */ InfoType *info; /* 该弧相关信息的指针(可无) */ }ArcCell,AdjMatrix[MAX_VERTEX_NUM][MAX_VERTEX_NUM]; typedef struct { VertexType vexs[MAX_VERTEX_NUM]; /* 顶点向量 */ AdjMatrix arcs; /* 邻接矩阵 */ int vexnum,arcnum; /* 图的当前顶点数和弧数 */ GraphKind kind; /* 图的种类标志 */ }MGraph; typedef struct QNode { QElemType data; struct QNode *next; }QNode,*QueuePtr; typedef struct { QueuePtr front,rear; /* 队头、队尾指针 */ }LinkQueue; Status CreateUDG(MGraph *G) { /* 采用数组(邻接矩阵)表示法,由文件构造没有相关信息的无向图G */ int i,j; scanf("%d",&(*G).vexnum); for(i=0;i<(*G).vexnum;++i) /* 构造顶点向量 */ (*G).vexs[i] = i; for(i=0;i<(*G).vexnum;++i) /* 初始化邻接矩阵 */ for(j=0;j<(*G).vexnum;++j) { scanf("%d",&(*G).arcs[i][j].adj); /* 图 */ (*G).arcs[i][j].info=NULL; /* 没有相关信息 */ } (*G).kind=AG; return OK; } int LocateVex(MGraph G,VertexType u) { /* 初始条件:图G存在,u和G中顶点有相同特征 */ /* 操作结果:若G中存在顶点u,则返回该顶点在图中位置;否则返回-1 */ int i; for(i=0;i<G.vexnum;++i) if(u == G.vexs[i]) return i; return -1; } VertexType* GetVex(MGraph G,int v) { /* 初始条件: 图G存在,v是G中某个顶点的序号。操作结果: 返回v的值 */ if(v>=G.vexnum||v<0) exit(ERROR); return &G.vexs[v]; } int FirstAdjVex(MGraph G,VertexType v) { /* 初始条件: 图G存在,v是G中某个顶点 */ /* 操作结果: 返回v的第一个邻接顶点的序号。若顶点在G中没有邻接顶点,则返回-1 */ int i,j=0,k; k=LocateVex(G,v); /* k为顶点v在图G中的序号 */ if(G.kind==DN||G.kind==AN) /* 网 */ j=INFINITY; for(i=0;i<G.vexnum;i++) if(G.arcs[k][i].adj!=j) return i; return -1; } int NextAdjVex(MGraph G,VertexType v,VertexType w) { /* 初始条件: 图G存在,v是G中某个顶点,w是v的邻接顶点 */ /* 操作结果: 返回v的(相对于w的)下一个邻接顶点的序号, */ /* 若w是v的最后一个邻接顶点,则返回-1 */ int i,j=0,k1,k2; k1=LocateVex(G,v); /* k1为顶点v在图G中的序号 */ k2=LocateVex(G,w); /* k2为顶点w在图G中的序号 */ if(G.kind==DN||G.kind==AN) /* 网 */ j=INFINITY; for(i=k2+1;i<G.vexnum;i++) if(G.arcs[k1][i].adj!=j) return i; return -1; } Status InitQueue(LinkQueue *Q) { /* 构造一个空队列Q */ (*Q).front=(*Q).rear=(QueuePtr)malloc(sizeof(QNode)); if(!(*Q).front) exit(OVERFLOW); (*Q).front->next=NULL; return OK; } Status QueueEmpty(LinkQueue Q) { /* 若Q为空队列,则返回TRUE,否则返回FALSE */ if(Q.front==Q.rear) return TRUE; else return FALSE; } Status DeQueue(LinkQueue *Q,QElemType *e) { /* 若队列不空,删除Q的队头元素,用e返回其值,并返回OK,否则返回ERROR */ QueuePtr p; if((*Q).front==(*Q).rear) return ERROR; p=(*Q).front->next; *e=p->data; (*Q).front->next=p->next; if((*Q).rear==p) (*Q).rear=(*Q).front; free(p); return OK; } Status EnQueue(LinkQueue *Q,QElemType e) { /* 插入元素e为Q的新的队尾元素 */ QueuePtr p=(QueuePtr)malloc(sizeof(QNode)); if(!p) /* 存储分配失败 */ exit(OVERFLOW); p->data=e; p->next=NULL; (*Q).rear->next=p; (*Q).rear=p; return OK; } bool visited[MAX_VERTEX_NUM]; /* 访问标志数组(全局量) */ Status(*VisitFunc)(VertexType); /* 函数变量 */ void BFSTraverse(MGraph G,Status(*Visit)(VertexType)) { /* 初始条件: 图G存在,Visit是顶点的应用函数。算法7.6 */ /* 操作结果: 从第1个顶点起,按广度优先非递归遍历图G,并对每个顶点调用函数 */ /* Visit一次且仅一次。一旦Visit()失败,则操作失败。 */ /* 使用辅助队列Q和访问标志数组visited */ int v,u,w; VertexType w1,u1; LinkQueue Q; for(v=0;v<G.vexnum;v++) visited[v]=FALSE; /* 置初值 */ InitQueue(&Q); /* 置空的辅助队列Q */ for(v=0;v<G.vexnum;v++) if(!visited[v]) /* v尚未访问 */ { visited[v]=TRUE; /* 设置访问标志为TRUE(已访问) */ Visit(G.vexs[v]); EnQueue(&Q,v); /* v入队列 */ while(!QueueEmpty(Q)) /* 队列不空 */ { DeQueue(&Q,&u); /* 队头元素出队并置为u */ u1 = *GetVex(G,u); for(w=FirstAdjVex(G,u1);w>=0;w=NextAdjVex(G,u1,w1 = *GetVex(G,w))) if(!visited[w]) /* w为u的尚未访问的邻接顶点的序号 */ { visited[w]=TRUE; Visit(G.vexs[w]); EnQueue(&Q,w); } } } printf("\n"); } Status visit(VertexType i) { printf("%d ",i); return OK; } int main() { int i,j,k,n; MGraph g; CreateUDG(&g); BFSTraverse(g,visit); return 0; }
Pascal :
program BFS; var a:array[0..1000,0..1000]of integer; i,j,k,n,s:integer; v:array[0..1000]of boolean; b:array[0..1000]of integer; front,tail:integer; procedure bfs(x:integer); var j:integer; begin v[i]:=true; b[tail]:=x; while front<=tail do begin for j:=0 to n-1 do if (a[b[front],j]=1)and(v[j]=false)then begin inc(tail); v[j]:=true; b[tail]:=j; end; inc(front); end; end; {*********main*********} begin readln(n);front:=1; fillchar(v,sizeof(v),false); for i:=0 to n-1 do for j:=0 to n-1 do begin read(a[i,j]); end; for i:=0 to n-1 do if not v[i] then begin tail:=front;bfs(i);end; for i:=1 to n do write(b[i],' '); writeln; end.
Java :
import java.util.LinkedList; import java.util.Scanner; public class Main { private static Scanner s = new Scanner(System.in) ; public static void main(String[] args) { int n = s.nextInt() ; int a[][] = new int[n][n] ; for (int i = 0; i < n; i++) { for (int j = 0; j < n; j++) { a[i][j] = s.nextInt() ; } } for (int i = 0; i < a.length; i++) { a[i][i] = 1 ; } boolean visited[] = new boolean[a.length] ; LinkedList<Integer> queue = new LinkedList<Integer>() ; queue.add(0) ; System.out.print(0+ " ") ; visited[0] = true ; while(queue.size()!=0){ int k = queue.pollFirst() ; for (int i = 0; i < visited.length; i++) { if(visited[i]==false&&a[k][i]==1){ visited[i] = true ; queue.add(i) ; System.out.print(i+" ") ; } } } System.out.println(); } }
- 1
Information
- ID
- 572
- Time
- 1000ms
- Memory
- 32MiB
- Difficulty
- (None)
- Tags
- # Submissions
- 0
- Accepted
- 0
- Uploaded By