蓝桥杯 - 网格寻路(图论 2013 国赛)

题目描述:
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
本题的主要问题是:
1、 输入的顶点数最大可能有1*10的4次方,如果用邻接矩阵表示,那么就要10000×10000大小的数组。明显是不行的。
最好还是要用邻接表(这里我用的是数组表示的邻接表)。
2、 很容易看出是求路径为2的路线有多少条,但是怎么判断是否合法?(合法:除了起始两个节点,其他的都不能相同,起始两个可以相同也可以不同)。
方法:dfs的每一次进行根据前面走过的判断,当前的节点A(前一个节点是C),其下一个节点B,不能和C相同。

代码:

#include<bits/stdc++.h>
using namespace std;
// int edgs[10001][10001]; //不太可能,这是第一个主要的问题
//要用邻接表表示(点&边)
//题目其实就是求路径为2的有几条(不管起始相同与否),但是要求中间的不能相同(尾部可以)
struct edge
{
    int x, y;//始末两点
    int next;
}edgs[20010];
int vexs[10005];//点表,值是由此点出发的第一条边
int vexNum  = 0, edgNum = 0, ans = 0,tot = 0;
void Add(int x,int y)
{
    int head = vexs[x];
    tot++;
    edgs[tot].x = x;
    edgs[tot].y = y;
    edgs[tot].next = head/*下一条边的下标*/;
    vexs[x] = tot;
}
void dfs(int x/*当前的*/,int pre/*前一个*/,int num)
{
    if(num == 3)
    {
        ans++;
        return;
    }
    else
    {
        for (int i = vexs[x]; i ;i = edgs[i].next)
        {
            int next = edgs[i].y;
            //i为下一个边的下标
            if(next!=pre)
            {
                dfs(next,x,num+1);
            }
        }
    }
}
int main()
{
    int x, y,i;
    scanf("%d %d",&vexNum,&edgNum);
    // vexNum = 5,edgNum = 6;
    for (int i = 1; i <= edgNum;i++)
    {
        scanf("%d%d",&x,&y);
        Add(x,y);
        Add(y,x);
    }
    for (int i = 1; i <= vexNum; i++)
    {
        dfs(i,0,0);
    }
    printf("%d",ans);
    return 0;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值