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

在这里插入图片描述

在这里插入图片描述


思路:

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

猜你喜欢

转载自blog.csdn.net/hunkwu/article/details/115417450