NOIP 2017 提高组初赛试题_完善程序 02 (最长路径)

该程序使用C++实现,首先通过邻接矩阵存储图,然后进行拓扑排序,接着计算以各节点为终点的最长路径长度,最终找出整个图的最长路径。关键步骤包括更新节点入度、寻找入度为0的节点、拓扑排序以及遍历更新路径长度。
摘要由CSDN通过智能技术生成

给定一个有向无环图,
每条边长度为 1,求图中的最长路径长度。
(第五空 2 分,其余 3 分)
 输入:第一行是结点数 n(不超过 100)和边数 m,
 接下来 m 行,每行两个整数 a, b,
 表示从结点 a 到结点 b 有一条有向边。
 结点标号从 0 到(n-1)。 
 输出:最长路径长度。 
 提示:先进行拓扑排序,然后按照拓扑序计算最长路径。




#include <iostream>
using namespace std;
int n, m, i, j, a, b, head, tail, ans;
int graph[100][100]; // 用邻接矩阵存储图
int degree[100];     // 记录每个结点的入度
int len[100];        // 记录以各结点为终点的最长路径长度
int queue[100];      // 存放拓扑排序结果
int main()
{
    cin >> n >> m;
    for (i = 0; i < n; i++)
        for (j = 0; j < n; j++)
            graph[i][j] = 0;
    //记录每个结点的入度
	for (i = 0; i < n; i++)
        degree[i] = 0;
    
	for (i = 0; i < m; i++)
    {
        cin >> a >> b;
        graph[a][b] = 1;
        //(1);
        degree[b]=degree[b]+1;
    }
    
	//找入度为0的节点 
	tail = 0;
    for (i = 0; i < n; i++)
        if (degree[i]==0 )
        {
        	//入队 
            queue[tail] = i;
            tail++;
        }
    
	head = 0;
    while (tail < n - 1)
    {
        for (i = 0; i < n; i++)
            if (graph[queue[head]][i] == 1)
            {
            	degree[i]=degree[i]-1;
                //(3);
                if (degree[i] == 0)
                {
                    queue[tail] = i;
                    tail++;
                }
            }
        //出队 
		//(4);head=head+1
        head=head+1;
    }
    
    for(i=0;i<n;i++)
    {
    	cout<<"i="<<i<<" "<<queue[i]<<endl;
	}
    
	ans = 0;
    for (i = 0; i < n; i++)
    {
        a = queue[i];
        len[a] = 1;
        for (j = 0; j < n; j++)
            if (graph[j][a] == 1 && len[j] + 1 > len[a])
                len[a] = len[j] + 1;
        if ( ans<len[a] )
            ans = len[a];
    }
    
	cout << ans << endl;
    
	return 0;
}
/*
1.正确答案: degree[b]=degree[b]+1 / degree[b]++ / ++degree[b]
2.正确答案: degree[i]==0 / !degree[i]
3.正确答案: degree[i]=degree[i]-1 / degree[i]-- / --degree[i]
4.正确答案: head=head+1 / head++ / ++head
5.正确答案: ans<len[a] / len[a]>ans
*/



2017年NOIP提高组初赛真题讲解

2017年NOIP提高组初赛真题讲解_哔哩哔哩_bilibili

2018年NOIP提高组初赛真题讲解

2018年NOIP提高组初赛真题讲解_哔哩哔哩_bilibili

 




 


 


 

 

 

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

dllglvzhenfeng

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值