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