当前位置:主页 > 查看内容

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

发布时间:2021-04-14 00:00| 位朋友查看

简介:思路 拓扑排序 直接找入度为0的-1 dfs实现 C o d e Code C o d e : # 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 ] ,……

在这里插入图片描述

在这里插入图片描述


思路:

拓扑排序
直接找入度为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;
}

;原文链接:https://blog.csdn.net/hunkwu/article/details/115417450
本站部分内容转载于网络,版权归原作者所有,转载之目的在于传播更多优秀技术内容,如有侵权请联系QQ/微信:153890879删除,谢谢!

推荐图文


随机推荐