输入格式:
第一行为两个数n和m,n表示图中节点的总数,m表示图中边的总数
第二行开始为m条无向边
注意:
1.节点从1开始编号,如果n为3,那么图中节点编号仅为1,2,3;如果n为5,那么图中节点编号仅为1,2,3,4,5
2.n的范围为 1<=n<=10
3.图肯定为连通图
输出格式:
按照从小到大的顺序输出割边,每条割边输出1行,没有割边则不输出
注意:
1.如果1 2这条边是割边,因为是无向图2 1肯定也是割边,但是仅输出1 2
2.如果1 2和2 3均是割边,则先输出1 2,再输出2 3, 以此类推
3.如果1 2和1 3均是割边,则先输出1 2,再输出1 3, 以此类推
#include <stdio.h>
#include <stdlib.h>
#define OK 1
#define ERROR 0
#define TRUE 1
#define FALSE 0
#define INFEASIBLE -1
#define OVERFLOW -2
#define MAX_VERTEX_NUM 11//最大顶点数
typedef int Status;
typedef int VertexType;//顶点数据类型为字符型
//边(弧)结点数据类型
typedef struct ArcNode{
int adjvex;//该边(弧)所依附(指向)的顶点在顶点数组的下标
struct ArcNode*nextarc;//指向下一条边(弧)的指针
}ArcNode;
//顶点数据数据类型
typedef struct VNode{
VertexType data;//顶点数据信息
ArcNode *firstarc;//指向第一条依附该顶点的边(弧)的指针
}VNode,AdjList[MAX_VERTEX_NUM];
//图的邻接表数据类型
typedef struct {
AdjList vertices;//图的顶点数组
int vexnum,arcnum;//图的当前顶点数和边(弧)数
}ALGraph;
Status CreateALGraph(ALGraph *G,int vexnum,int arcnum,int *vexs,int *arcs);
Status OutMGraph(ALGraph *G);
Status DFSTraverse(ALGraph *G);
Status BFSTraverse(ALGraph *G);
Status CreateALGraph(ALGraph *G,int vexnum,int arcnum,int *vexs,int *arcs){
int i,j,k;
ArcNode *s;
G->vexnum=vexnum;//图的顶点
G->arcnum=arcnum;//图的弧数
for(i=1;i<=G->vexnum;i++)
{
G->vertices[i].data=vexs[i];
G->vertices[i].firstarc=NULL;//顶点数组存入变量 ,所有的顶点结点建好
}
//建边结点
for(k=0;k<G->arcnum;k++){
i=arcs[2*k+1];//被指向的点 的下标
j=arcs[2*k+2];//指向的点
s=(ArcNode *) malloc (sizeof (ArcNode));//辅助边
s->adjvex=j;
s->nextarc=G->vertices[i].firstarc;
G->vertices[i].firstarc=s;
s=(ArcNode *) malloc (sizeof (ArcNode));
s->adjvex=i;
s->nextarc=G->vertices[j].firstarc;
G->vertices[j].firstarc=s;
}
return OK;
}
Status OutMGraph(ALGraph *G){
int i;
ArcNode *p;
printf("顶点集:(");
for(i=1;i<=G->vexnum;i++)
printf(" %d",G->vertices[i].data);
printf(")\n");
printf("邻接表:\n");
for(i=1;i<=G->vexnum;i++){
printf("%d",G->vertices[i].data);
p=G->vertices[i].firstarc;
while(p){
printf("->%d",p->adjvex);
p=p->nextarc;
}
printf("\n");
}
return OK;
}
int visited[MAX_VERTEX_NUM];//访问标志数组
//深度优先遍历图G(递归)
Status DFS(ALGraph *G,int i){
ArcNode *p;
visited[i]=TRUE;
p=G->vertices[i].firstarc;
while(p){
if(!visited[p->adjvex]) DFS(G,p->adjvex);
p=p->nextarc;
}
return OK;
}
Status DFSTraverse(ALGraph *G){
int i;
int y=0;
for(i=1;i<=G->vexnum;i++) visited[i]=FALSE;
i=1;
while(i<=G->vexnum){
if(!visited[i]) {
y++;
DFS(G,i);
}
i++;
}
return y;
}
int main(){
ALGraph *G;
ALGraph *T;
int jz[11][11];
G=(ALGraph *) malloc (sizeof (ALGraph));
T=(ALGraph *) malloc (sizeof (ALGraph));
int i,vexnum,arcnum;
int n,m,j;
int z=0;
int y=0;
int w;
int *vexs;
int *arcs;
int arcs1[100];
int dian[100];
scanf("%d %d",&vexnum,&arcnum);
vexs=(int *) malloc ((vexnum+1) * sizeof (int));
for(i=1;i<=vexnum;i++){
vexs[i]=i;
dian[i]=0;
}
arcs=(int *) malloc (2 * (arcnum+1) * sizeof (int));
for(i=1;i<=arcnum;i++){
scanf("%d %d",&n,&m);
arcs[2*i-1]=n;
arcs[2*i]=m;
}
for(i=1;i<=vexnum;i++){
for(j=1;j<=vexnum;j++)
jz[i][j]=0;
}
CreateALGraph(G,vexnum,arcnum,vexs,arcs);
w=DFSTraverse(G);
m=0;
for(i=1;i<=arcnum;i++){
for(n=1;n<=arcnum;n++){//删除边
if(n!=i){
m++;
arcs1[2*m-1]=arcs[2*n-1];
arcs1[2*m]=arcs[2*n];
}
}
CreateALGraph(T,vexnum,m,vexs,arcs1);
j=DFSTraverse(T);
if(j>w){
jz[arcs[2*i-1]][arcs[2*i]]=1;
jz[arcs[2*i]][arcs[2*i-1]]=1;
}
m=0;
}
n=0;
for(i=1;i<=vexnum;i++){
for(j=i;j<=vexnum;j++){
if(jz[i][j]==1){
if(n==0){
printf("%d %d",i,j);
n++;
}
else
printf("\n%d %d",i,j);
}
}
}
return 0;
}