从起点S到终点T,求一条路线获得最多的收益( 每个点收益a[i] ) , 可以重复通过路和点
裸题 缩点+最长路
#include <bits/stdc++.h> using namespace std ; const int N=5e5+2; int n,m,pool,a[N]; int low[N],dfn[N]; int kcnt,id[N]; int f[N],val[N]; vector<int> g[N],vc[N]; stack<int> st; void tar(int x){ dfn[x]=low[x]=++pool; st.push(x); int i,y; for(i=0;i<g[x].size();i++){ y=g[x][i]; if(!dfn[y]) tar(y),low[x]=min(low[x],low[y]); else if(!id[y]) low[x]=min(low[x],dfn[y]); } if(dfn[x]==low[x]){ kcnt++; do{ y=st.top(); st.pop(); id[y]=kcnt; }while(y!=x); } } int dis[N],vis[N]; void spfa(int v0){ queue<int> q; memset(dis,0,sizeof(dis)); dis[v0]=val[v0]; q.push(v0); vis[v0]=1; int i,x,y,z; while(q.empty()==0){ x=q.front(),q.pop(); vis[x]=0; for(i=0;i<vc[x].size();i++){ y=vc[x][i]; z= val[y]; if(dis[x]+z>dis[y]){ dis[y]=dis[x]+z; if(!vis[y]) vis[y]=1,q.push(y); } } } } int main(){ int i,j,x,y; scanf("%d%d",&n,&m); for(i=1;i<=m;i++) scanf("%d%d",&x,&y),g[x].push_back(y); for(i=1;i<=n;i++) scanf("%d",a+i); for(i=1;i<=n;i++) if(!dfn[i]) tar(i); for(i=1;i<=n;i++) val[id[i]]+=a[i]; for(i=1;i<=n;i++) for(j=0;j<g[i].size();j++){ x=id[i],y=id[g[i][j]]; if(x!=y) vc[x].push_back(y); } int S,E; cin>>S>>E; spfa(id[S]); int t=0; while(E--){ scanf("%d",&i); t=max(t,dis[id[i]]); } cout<<t<<'\n'; }
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· 单线程的Redis速度为什么快?
· SQL Server 2025 AI相关能力初探
· AI编程工具终极对决:字节Trae VS Cursor,谁才是开发者新宠?
· 展开说说关于C#中ORM框架的用法!