当前位置: 代码迷 >> 综合 >> 第十次CCF认证第四题图论题 C语言编程解析及其答案
  详细解决方案

第十次CCF认证第四题图论题 C语言编程解析及其答案

热度:103   发布时间:2023-10-12 05:00:54.0

这个题意思是,最后形成的图中每一个点,要么为0条隧道经过,要么联通两个隧道。所以可以用下面的代码实现



#include <stdio.h>

#include <stdlib.h>


int main()
{
    int n,m,i,j,k=0,t[2],max[2];
    scanf("%d%d",&n,&m);
    struct node{
      int st;
      int en;
      int day;
    }node[m],node2[2][m];//node2用来存储从两个方向出发的路径节点
    for(i=0;i<m;i++)
    {
        scanf("%d",&node[i].st);
        scanf("%d",&node[i].en);
        scanf("%d",&node[i].day);
    }
      for(i=0;i<2;i++)
        for(j=0;j<m;j++)
        {
           node2[i][j].day=0;
        }//初始化存储路径节点
    for(i=0;i<m;i++)
    {
        if(node[i].st==1)
        {
            t[k]=i;//有两个节点开始站点是1,节点下标分别存储在t[0],t[1];
            node2[k][0]=node[i];//分别把两个节点存储在node2[0][0],node2[1][0]中
            k++;
        }
    }
    for(i=0;i<2;i++)//分别从两个方向出发开始找下一个路径节点
    {
     k=1;
    while(node[t[i]].en!=n)
    {
        for(j=0;j<m;j++)
        {
            if(node[t[i]].en==node[j].st)
            {
                node2[i][k]=node[j];//将找到的路径节点存储在node2[i]中,i可以等于1或2.分别表示两条路径
                t[i]=j;
                k++;
            }
        }
    }
    }
    for(i=0;i<2;i++)
    {
        max[i]=node2[i][0].day;
        for(j=0;j<m;j++)
        {
            if(max[i]<node2[i][j].day)
            max[i]=node2[i][j].day;
        }
    }//分别找出两条路径的最大天数
    if(max[0]<max[1])
    printf("%d",max[0]);
    else
    printf("%d",max[1]);
    return 0;
}
  相关解决方案