题目描述
题目描述
从键盘接收图的顶点集,关系集,创建无向图。
第一行依次输入图的顶点个数n,关系个数k,以空格隔开。顶点个数<=20
第二行依次输入顶点值,类型为字符。
接下去有k行,每行为两个字符 u 和 v,表示节点u 和 v 连通。格式为【uv】,中间不用空格间隔。
计算连通分量个数并输出。
输出一个整数,表示连通分量个数。
样例输入 Copy
6 7
ABCDEF
AB
AE
BC
CD
DA
DB
EC
样例输出 Copy
2
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#define MAXVEX 20
typedef struct SqStack{
int vex[ MAXVEX] ;
int front;
int rear;
} SqQueue;
typedef struct
{
int arcs[ MAXVEX] [ MAXVEX] ;
int visited[ MAXVEX] ;
char vex[ MAXVEX] ;
int vexnum;
int arcnum;
} AdjMatrix;
void Create ( AdjMatrix * G) {
int i, j, k, vex1, vex2;
char Vex1, Vex2;
scanf ( "%d %d" , & G-> vexnum, & G-> arcnum) ;
for ( i = 1 ; i<= G-> vexnum; i++ ) {
for ( j = 1 ; j<= G-> vexnum; j++ ) {
G-> arcs[ i] [ j] = 0 ;
}
}
getchar ( ) ;
for ( i = 1 ; i<= G-> vexnum; i++ ) {
scanf ( "%c" , & G-> vex[ i] ) ;
}
getchar ( ) ;
for ( k = 0 ; k< G-> arcnum; k++ ) {
scanf ( "%c" , & Vex1) ;
vex1 = Vex1- 64 ;
scanf ( "%c" , & Vex2) ;
vex2 = Vex2- 64 ;
getchar ( ) ;
G-> arcs[ vex1] [ vex2] = 1 ;
}
}
void initialise ( AdjMatrix * G) {
for ( int i = 1 ; i<= G-> vexnum; i++ ) {
G-> visited[ i] = 0 ;
}
}
void DFS ( AdjMatrix * G, int Vo) {
printf ( "%c" , G-> vex[ Vo] ) ;
G-> visited[ Vo] = 1 ;
for ( int i = 1 ; i<= G-> vexnum; i++ ) {
if ( ! G-> visited[ i] && G-> arcs[ Vo] [ i] == 1 ) {
DFS ( G, i) ;
}
}
}
int FirstAdj ( AdjMatrix * G, int Vo) {
for ( int i = 1 ; i<= G-> vexnum; i++ ) {
if ( G-> arcs[ Vo] [ i] == 1 && G-> visited[ i] != 1 ) {
return i;
}
}
return - 1 ;
}
int NextAdj ( AdjMatrix * G, int Vo, int w) {
for ( int i = w+ 1 ; i<= G-> vexnum; i++ ) {
if ( G-> arcs[ Vo] [ i] == 1 && G-> visited[ i] != 1 ) {
return i;
}
}
return - 1 ;
}
void BFS ( AdjMatrix * G, int Vo) {
G-> visited[ Vo] = 1 ;
SqQueue * Q = ( SqQueue * ) malloc ( sizeof ( SqQueue) ) ;
Q-> front = 0 ;
Q-> rear = 0 ;
Q-> front++ ;
Q-> vex[ Q-> front] = Vo;
while ( Q-> front- Q-> rear!= 0 ) {
Vo = Q-> vex[ Q-> front] ;
Q-> rear++ ;
int w = FirstAdj ( G, Vo) ;
while ( w!= - 1 ) {
if ( ! G-> visited[ w] ) {
G-> visited[ w] = 1 ;
Q-> front++ ;
Q-> vex[ Q-> front] = w;
}
w = NextAdj ( G, Vo, w) ;
}
}
}
int visited[ MAXVEX] = { 0 } ;
void TraverseG ( AdjMatrix * G)
{
for ( int v = 0 ; v< G-> vexnum; v++ )
visited[ v] = 0 ;
for ( int v = 0 ; v< G-> vexnum; v++ )
if ( ! visited[ v] )
BFS ( G, v) ;
}
int main ( void )
{
int i, j;
int count = 0 ;
AdjMatrix * G = ( AdjMatrix * ) malloc ( sizeof ( AdjMatrix) ) ;
Create ( G) ;
initialise ( G) ;
for ( i = 1 ; i<= G-> vexnum; i++ ) {
if ( G-> visited[ i] != 1 ) {
BFS ( G, i) ;
count++ ;
}
}
printf ( "%d" , count) ;
return 0 ;
}