37分求debug

P1807 最长路

```cpp #include<iostream> #include<cstdio> #include<cstring> #include<string> #include<cmath> #include<queue> #include<vector> #include<algorithm> using namespace std; typedef long long ll; vector<int> vc1[1505]; vector<int> vc2[1505]; int in[1505],ans[1505]; void top_sort(int n){ queue<int> q; for(int i=2;i<=n;i++){ ans[i]=-1e9; if(!in[i]) q.push(i); } while(!q.empty()){ int a=q.front(); q.pop(); for(auto x:vc1[a]){ if(!--in[x]) q.push(x); } } q.push(1); while(!q.empty()){ int a=q.front(); q.pop(); for(int i=0;i<vc1[a].size();i++){ if(ans[vc1[a][i]]<ans[a]+vc2[a][i]) ans[vc1[a][i]]=ans[a]+vc2[a][i]; if(!--in[vc1[a][i]]) q.push(vc1[a][i]); } } } int main(){ // freopen(".in","r",stdin); // freopen(".out","w",stdout); ios::sync_with_stdio(false); cin.tie(0),cout.tie(0); int n,m; cin>>n>>m; for(int i=1;i<=m;i++){ int u,v,w; cin>>u>>v>>w; vc1[u].push_back(v); vc2[u].push_back(w); in[v]++; } top_sort(n); if(ans[n]==-1e9) cout<<-1; else cout<<ans[n]; // fclose(stdin); // fclose(stdout); return 0; } /* */ ``` 1. `ans`数组的初始化应该是`-inf`左右,因为最长路有可能`<-1`在你的程序里就取最大值`-1`了。 2. 没有考虑无解情况。 3. 拓扑排序(top_sort)写错了,每次在遍历一个数之后要删入度,也就是`in[vc1[a][i]]`先减1之后再判断是否为0。 4. 拓扑排序是入度为 $0$ 才加入不是有入度的加入。 还好,不过可以先复习复习拓扑排序。
by weak_in_code @ 2024-03-27 21:00:30


@[XingChen_MoNian](/user/920938)
by weak_in_code @ 2024-03-27 21:01:08


@[weak_in_code](/user/753640) 非常感谢 已收到,得多练练拓扑排序了
by XingChen_MoNian @ 2024-03-27 22:33:20


|