【dp】【dfs】【拓扑排序】工程

31 篇文章 1 订阅
2 篇文章 0 订阅
这篇博客探讨了一种利用拓扑排序求解图中最大路径的问题。代码实现中,通过深度优先搜索(DFS)策略,寻找入度为0的节点并更新最大路径值。在遍历过程中,不断更新节点的最远可达距离。最终,如果所有节点都被访问,则输出最大路径值;否则,输出-1表示存在环路。这种方法适用于无向图且边代表路径的负权值。
摘要由CSDN通过智能技术生成

在这里插入图片描述

在这里插入图片描述


思路:

拓扑排序
直接找入度为0的-1
dfs实现


C o d e Code Code:

#include<iostream>
#include<stdlib.h>
#include<cstdio>
#include<cmath>
using namespace std;
int f[220],s[220],a[220][220],c[220],r[220],q[220],h,t,n,ans,sum;
bool p[220];
void dfs(int d)
{  
	 int x = 0;
	 for (int i = 1; i <= n; i++)
	 { 
	     if (a[i][d] == 1)  
	     { 
	        r[i]--; 
	        if (r[i] == 0)   
	        	q[++t] = i;
	        f[i] = max (f[i], f[d] + s[i]); 
	    }
	}
}
int main()
{
	memset(p,false,sizeof(p));
	scanf("%d",&n);
	for (int i = 1; i <= n; i++)
	    scanf("%d", &s[i]);
	for (int i =1 ; i <= n; i++)
	    for (int j = 1; j <= n; j++)
	        if (i != j)
	        {
	           scanf("%d", &a[i][j]);
	           if (a[i][j]) c[j]++,r[i]++;  
	        }
	t = 0, sum = n;
	for (int i = 1; i <= n; i++)
	    if (!r[i])
	    {
	    	f[i] = s[i];  
	    	q[++t] =i ;  
	    }
    while (h < t)  
    {
    	  h++;
    	  dfs(q[h]); 
    }
	for (int i = 1; i <= n; i++)
	    if (!c[i])   
	       ans = max (ans,f[i]);   
	if (t < n)
	   printf ("-1");
	   else printf ("%d",ans);
	return 0;
}

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值