十五月明


私信TA

用户名:dotcpp0605328

访问量:5434

签 名:

等  级
排  名 319
经  验 5465
参赛次数 0
文章发表 87
年  龄 18
在职情况 学生
学  校 曲阜师范大学
专  业 人工智能

  自我简介:

Easy

解题思路:

该代码是一个关于作物杂交的问题,目标是计算得到特定作物种子的最早获得时间。

首先,通过输入读取作物种类总数n、初始拥有的作物种子类型数量m、可以杂交的方案数k和目标作物种子goal。

然后,通过循环遍历读取每个作物的生长时间t[i]。

接着,通过循环遍历读取拥有的作物种子类型z,并将have_k[z]标记为true。

再然后,通过循环遍历读取每个杂交方案的u、v和w,并将杂交方案存储到结构体father中。

然后,定义一个dfs函数,用于递归搜索获得种子x的最早获得时间。

在dfs函数中,首先判断如果种子x没有杂交方案,则返回false。

然后,通过循环遍历每个杂交方案,分别获取对应的u和v。

接着,判断如果种子u没有被获得,则尝试递归搜索获得种子u。

再然后,判断如果种子v没有被获得,则尝试递归搜索获得种子v。

接下来,判断如果种子x的limtime为0,则更新limtime为max(fa[u].limtime, fa[v].limtime) + max(t[u], t[v])。

否则,更新limtime为min(fa[x].limtime, max(fa[u].limtime, fa[v].limtime) + max(t[u], t[v]))。

最后,将种子x标记为已获得,并返回true。

最后,在主函数中调用input函数读取输入,然后调用dfs函数计算得到目标种子的最早获得时间,最后输出结果。

总结起来,该代码通过递归搜索的方式计算得到特定作物种子的最早获得时间。



注意事项:

参考代码:

#include <iostream>

using namespace std;

const int MAXN = 2000+5;

int n, m, k, goal;

int t[MAXN];

bool have_k[MAXN];      //若存在该种子则标记为ture

int zajiao[MAXN][MAXN];

struct father 

{

    int num;

    int u[MAXN];

    int v[MAXN];

    int limtime;

}fa[MAXN];


void swap(int& a, int& b){int tep = a; a = b; b = tep;}

void input()

{

    //N,M,K,goal,

    //N 表示作物种类总数 

    //M 表示初始拥有的作物种子类型数量,

    //K 表示可以杂交的方案数

    //goal目标

    cin >> n >> m >> k >> goal;

    for (int i = 1; i <= n; i++)

        cin >> t[i];

    for (int i = 1; i <= m; i++) {

        int z;

        cin >> z;

        have_k[z] = true;

    }

    

    for (int i = 1; i <= k; i++) {

        int u, v, w;

        cin >> u >> v >> w;

        zajiao[u][v] = zajiao[v][u] = w;        //二维矩阵u与v杂交出w

        int tep = ++fa[w].num;      //新种子w的杂交方案数量

        if (t[u] < t[v])swap(u, v);     //确保u的时间最大

        fa[w].u[tep] = u;   //将方案存储到结构体

        fa[w].v[tep] = v;

    }

}

bool dfs(int x)

{

    if (fa[x].num == 0)return false;

    

    for (int i = 1; i <= fa[x].num; i++)        //遍历获得种子x的min

    {

        int v = fa[x].v[i];

        int u = fa[x].u[i];

        

        if (!have_k[u]) {       //如果没有u则尝试遍历获取

            if (!dfs(u))continue;

        }

        if (!have_k[v]) {

            if (!dfs(v))continue;

        }

        

        if (!fa[x].limtime)

            fa[x].limtime = max(fa[u].limtime, fa[v].limtime) + max(t[u], t[v]);

        else

            fa[x].limtime = min(fa[x].limtime, max(fa[u].limtime, fa[v].limtime) + max(t[u], t[v]));

    }    

    have_k[x] = true;

    return true;

}

int main()

{

    input();

    dfs(goal);

    cout << fa[goal].limtime;

    return 0;

}


 

0.0分

1 人评分

  评论区

  • «
  • »