Problem1858--【图】6-9 基于邻接表的边的删除

1858: 【图】6-9 基于邻接表的边的删除

Time Limit: 1 Sec  Memory Limit: 128 MB
Submit: 1  Solved: 1
[Submit] [Status] [Web Board] [Creator:]

Description

给定一个无向图,在此无向图中删除一条边。

Input

多组数据,每组m+2行。第一行有两个数字n和m,代表有n个顶点和m条边。顶点编号为1到n。第二行到第m+1行每行有两个数字h和k,代表边依附的两个顶点。第m+2行有两个数字f和g,代表删除的边所依附的两个顶点。当n和m都等于0时,输入结束。

Output

每组数据输出n行。为删除边后的邻接表。每两个数字之间用空格隔开。

Sample Input Copy

3 2
1 2
2 3
3 2
3 1
1 2
1 2
0 0

Sample Output Copy

1 2
2 1
3
1
2
3

HINT

#include<iostream>
#define OK 1
#define ERROR 0
#define OVERFLOW -2
#define MVNum 100     //最大顶点数
using namespace std;
typedef struct ArcNode
{//边结点
    int adjvex;                //邻接点域:该边所指向的顶点的位置
    int data;                  //数据域:存储和边相关的信息
    struct ArcNode* nextarc;   //链域:指向下一条边的指针
}ArcNode;
typedef struct VNode
{//顶点信息
    int data;              //顶点结点的数据域
    ArcNode *firstarc;     //链域:指向第一条依附该顶点的边的指针
}VNode,AdjList[MVNum];     //AdjList表示邻接表类型
typedef struct
{//邻接表
    AdjList vertices;
    int vexnum,arcnum;    //图的当前顶点数和边数
}ALGragh;
int CreateUDG(ALGragh &G,int vexnum,int arcnum)
{//采用邻接表表示法,创建无向图G
    G.vexnum=vexnum;     //输入总顶点数
    G.arcnum=arcnum;     //输入总边数
    if(G.vexnum>MVNum) return ERROR;  //超出最大顶点数则结束函数
    for(int i=0;i<G.vexnum;++i)       //构造表头结点表
    {
        G.vertices[i].data=i+1;       //输入顶点值
        G.vertices[i].firstarc=NULL;   //初始化表头结点的指针域为NULL
    }
    for(int j=0;j<G.arcnum;j++)      //输入各边,构造邻接表
    {
        int h,k;
        cin>>h>>k;                  //输入一条边依附的两个顶点h和k
        ArcNode* p1=new ArcNode;        //生成一个新的边结点*p1
        p1->adjvex=h-1;                 //邻接点序号为h-1,即顶点在G.vertices中的序号
        p1->data=k;
        p1->nextarc=G.vertices[h-1].firstarc;   //将新结点*p1插入顶点vh-1的边表头部
        G.vertices[h-1].firstarc=p1;
        ArcNode* p2=new ArcNode;         //生成一个新的边结点*p2
        p2->adjvex=k-1;                  //邻接点序号为k-1,即顶点在G.vertices中的序号
        p2->data=h;
        p2->nextarc=G.vertices[k-1].firstarc;     //将新结点*p2插入顶点vk-1的边表头部
        G.vertices[k-1].firstarc=p2;
    }
    return OK;
}
int DeleteArc(ALGragh &G)
{//在以邻接表形式存储的无向图G上删除边
/**************begin************/
   



   
    /**************end************/
}
int PrintGraph(ALGragh G)
{//输出图G
    for(int i=0;i<G.vexnum;i++)
    {
        cout<<G.vertices[i].data;        //先输出顶点信息
        ArcNode* p=G.vertices[i].firstarc;     //初始化指针p指向与顶点邻接的第一个边结点
        if(p==NULL)               //不存在与顶点邻接的第一个边结点
        {
            cout<<endl;
            continue;
        }
        else                    //存在时遍历边表
        {
            cout<<" ";
            while(p->nextarc)
            {
            cout<<p->data<<" ";
            p=p->nextarc;
            }
            cout<<p->data<<endl;
        }
    }
    return OK;
}
int main()
{
    int n,m;
    while(cin>>n>>m)
    {
        if(n==0&&m==0) break;     //输入结束标志
        ALGragh G;
        CreateUDG(G,n,m);      //采用邻接表表示法,创建无向图G
        DeleteArc(G);        //在图G中增添新顶点
        PrintGraph(G);      //输出图G
    }
    return 0;
}

Source/Category