C语言输出无向图的割边

输入格式:

第一行为两个数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;
}
 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

林中晚霞

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值