题目链接
https://ac.nowcoder.com/acm/contest/12482/A
解题思路
1.广搜
1.我一开始的思路是用广搜,不使用拓扑排序;
2.因为我看到题目中说明了不存在环,且我以为拓扑排序的作用是判断有没有环,所以觉得广搜跟拓扑排序在这题没有区别;
然后~~~~
再然后我考虑到可能是因为有节点重复入队,比如样例中节点5就进入了两次,但是这不能用广搜解决;
2.拓扑排序
拓扑排序代码展示
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const int maxn=1e5+7;
/*
*/
vector<int>G[maxn];
int W[maxn];
int dp[maxn];//表示到i点能取得的最大值
int lev[maxn];
void Tp(){
queue<int>q;
q.push(0);
while(!q.empty()){
int temp=q.front();
q.pop();
for(int i=0;i<G[temp].size();i++){
int f=G[temp][i];
dp[f]=max(dp[f],dp[temp]+W[f]);
lev[f]-=1;
if(lev[f]==0)
q.push(f);
}
}
}
int main(){
int n,m;
cin>>n>>m;
for(int i=1;i<=n;i++)
cin>>W[i];
while(m--){
int a,b;
cin>>a>>b;
lev[b]+=1;
G[a].push_back(b);
}
Tp();
cout<<dp[n]<<endl;
return 0;
}
总结
拓扑排序与广搜的区别:
拓扑排序:
1.必须是有向无环图;
~待更新~