题目考点判断
- 有依赖的背包问题
解决过程
- 判环
- 缩点
- d f s dfs dfs 套 D P DP DP
1.判环
F l o y d Floyd Floyd 判环,如果 k k k 到 i i i 有一条路径且 i i i 到 j j j 有一条路径,就代表 i i i 和 j j j 是联通的。
for(int i=1; i<=n; i++)
for(int j=1; j<=n; j++)
for(int k=1; k<=n; k++)
if(mapp[k][i]==1&&mapp[i][j]==1)
mapp[k][j]=1;
2. 缩点
情况1.
点 i i i 所在的环之前没有判断过,是新环。
那么,我们将这个新环放到数组最后,即新加一个点,
然后让这两个点的空间标记为负值 t m p w tmpw tmpw,且 t m p w + t m p n tmpw+tmpn tmpw+tmpn(新点的下标)等于原来的点数,
这样,我们就可以通过某个点的空间迅速找到他所在的新点。
像钥匙一样一一对应;
if(mapp[i][j]==1&&mapp[j][i]==1&&i!=j&&w[j]>0&&w[i]>0)
{
jsn++;
v[jsn]=v[i]+v[j]; //统计空间,价值
w[jsn]=w[i]+w[j];
jsw--;
w[i]=jsw,w[j]=jsw;
}
情况2.
点 i i