图论学习

用邻接表存储有向图,并输出各顶点的出入和入度。
输入描述:
输入文件中包含多个测试数据,每个测试数据描述了一个无权有向图。每个测试数据的第一
行为两个正整数n和m,1≤n ≤100,1≤ m ≤500,分别表示该有向图的顶点数目和边数,顶点的
序号从1开始计起。接下来有m行,每行为两个正整数,用空格隔开,分别表示一条边的起点和
终点。每条边出现一次且仅一次,图中不存在自身环和重边。输入文件最后一行为0 0,表示输入
数据结束。
输出描述:
对输入文件中的每个有向图,输出两行:第1行为n个正整数,表示每个顶点的出度;第2
行也为n个正整数,表示每个顶点的入度。每两个正整数之间用一个空格隔开,每行的最后一个
正整数之后没有空格。
样例输入:  
7 9 
1 2 
2 3 
2 5 
2 6 
3 5 
4 3 
5 2 
5 4 
6 7 
4 7 
1 4 
2 1 
2 2 
2 3 
2 3 
4 2 
4 3 

0 0

样例输出:

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

#include <stdio.h>
#include<cstring>
#include<stdlib.h>
#define N 505
struct Vertex//边节点
{
    int order;
    Vertex *next;
};
struct Graph//图结构体
{
    struct  vertex{
        Vertex *p,*q;
    }V[N];//顶点数组
    int n1,n2;
};
Graph head;
void creat(int n,int m)//创建一个n个顶点,m条边的图
{
    head.n1=n,head.n2=m;
    for(int i=1;i<=n;i++)
    {
        head.V[i-1].p=NULL;
        head.V[i-1].q=NULL;
    }
    int v1,v2;
    Vertex *f;
    for(int i=1;i<=m;i++)
    {
        scanf("%d%d",&v1,&v2);
        f=new Vertex;
        f->order=v2-1;
        f->next=head.V[v1-1].p;
        head.V[v1-1].p=f;
        f=new Vertex;
        f->order=v1-1;
        f->next=head.V[v2-1].q;
        head.V[v2-1].q=f;
    }
}
void Delete()//删除图
{
    Vertex *f;
    for(int i=0;i<head.n1;i++)
    {
        f=head.V[i].p;
        while(f!=NULL)
        {
            head.V[i].p=f->next;
            delete f;
            f=head.V[i].p;
        }
        f=head.V[i].q;
        while(f!=NULL)
        {
            head.V[i].q=f->next;
            delete f;
            f=head.V[i].q;
        }
    }
}
int main()
{
    int m,n;
    freopen("in.txt","r",stdin);
    while(scanf("%d%d",&n,&m))
    {
        if(!m&&!n)return 0;
        creat(n,m);
        int flag=1;
        for(int i=0;i<head.n1;i++)//计算出度
        {
            int t=0;
            Vertex *f=head.V[i].p;
            while(f!=NULL)
            {
                f=f->next;
                t++;
            }
            if(flag){flag=0;printf("%d",t);}
            else printf(" %d",t);
        }
        printf("\n");
        flag=1;
        for(int i=0;i<head.n1;i++)//计算入度
        {
            int t=0;
            Vertex *f=head.V[i].q;
            while(f!=NULL)
            {
                f=f->next;
                t++;
            }
            if(flag){flag=0;printf("%d",t);}
            else printf(" %d",t);
        }
        printf("\n");
        Delete();
    }
    return 0;
}


  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值