笔记:图的基础概念以及贪心案例

文章介绍了使用C语言实现的栈数据结构处理行星碰撞问题,包括栈的初始化、压入、弹出等操作。同时,文章阐述了图的基本概念,如顶点、边、有向图、无向图、权值、路径、环、连通图、强连通图和度数,为后续的图论学习打下基础。

行星碰撞问题:

#include "stdio.h"
#include "malloc.h"
#include "math.h"

typedef struct zhan
{
    int *top;
    int *base;
    int size;
}zhan_named;

int chushihua(zhan_named *s,int n);
int pop(zhan_named *s);
int get_top(zhan_named*s,int *x);
void planet(zhan_named *s);
int push(zhan_named *s,int x);

int main()
{
    zhan_named s;
    int n,num;
    
    
    printf("请输入数据的个数:");
    scanf("%d" , &n);
    
    chushihua(&s,n);
    
    for(int i=0;i<n;i++)
    {
        scanf("%d",&num);
        push(&s,num);
    }
    
    planet(&s);
   
    return 0;
}

int chushihua(zhan_named *s,int n)
{
    s->base=(int*)malloc(n*sizeof(int));
    
    if(s->base==NULL)
    {
        printf("overflow!");
        exit(0);
    }
    
    s->top=s->base;
    s->size=n;
    return 1;
}

int push(zhan_named *s,int x)
{
    if((s->top-s->base)/sizeof(int)==s->size)
    {
        printf("栈满");
        return 0;
    }
    
    *s->top++=x;
    return 1;
}

int pop(zhan_named *s)
{
    if(s->top<=s->base)
    {
        printf("栈空");
        return 0;
    }
    --s->top;
    return 1;
}


int get_top(zhan_named*s,int *x)
{
    
    if(s->top<=s->base)
    return 0;
    
    *x=*s->top;
    return 1;
}


void planet(zhan_named *s)
{
 int front, next;

    s->top--;

    if (!get_top(s, &next)) 
    {
        printf("栈空");
        return;
    }
    
    pop(s);

    while (get_top(s, &front))
    {    
        if (next > 0) 
        {
            next = front;
            pop(s);
            continue;
        } 
        else if (next * front < 0) 
               {  
                if (-front > next) 
                {
                *(s->top + 1) = 0;  // 标记为碰撞之后的新元素
                next = front;
                continue;
                } 
                else if (-front < next) 
                {
                *(s->top) = 0;
                continue;
                } 
                    else {
                    *(s->top + 1) = 0;
                    *(s->top) = 0;
                    next = *(--s->top);
                    continue;
                    }
        }

        if ((next>0&&front>0)||(next<0&&front<0)) 
        {
            *(s->top+1)=0;
            next=front;
            continue;
        }
        pop(s);
    }
    
    return ;
}

 

图的基础概念:

1.顶点(Vertex):是图中的基本单位,(理解为有穷非空的集合)。

2.边(Edge):是节点之间的联系,通常由两个节点之间的连线来表示。

3.有向图:边有方向的图称为有向图,也叫做 Digraph。

4.无向图:边没有方向的图称为无向图。

5.权:边可以带有权值,表示任意两个节点之间的距离或者代价。

6.图的路径:从一个结点出发经过若干条边到达另一个结点的过程称为路径。

7.环:在一条路径中,如果一个结点被访问了两次及以上,则该路径就称为环。

8.连通图:在无向图中,如果存在一条路径可以从一个节点到达另一个

9.意节点,则该图称为连通图。

10.强连通图:在有向图中,如果任意两个节点之间都存在一条路径,则该图称为强连通图。

11.子图:一个图的一部分称为它的子图。

12.度:一个节点有多少条边与它相连,就称为该节点的度数。在有向图中,节点的度分为入度和出度。

由图可以构造树:

 

 

即为一个有向树。

刚对图进行简单接触,了解不多,未完待续。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值