1 条题解

  • 0
    @ 2026-11-14 13:27:39
    #include <bits/stdc++.h>
    using namespace std;
    const int inf=1e9+5;
    const int N=3e5+5;
    struct edge{
    	int to;
    	int w;
    };
    vector<edge>G[N];
    int dis[N];
    bool vis[N];
    int main(){
    	int n,m;
    	cin>>n>>m;
    	for(int i=1;i<=n;i++){
    		int x;
    		cin>>x;
    		G[i].push_back({i+n,-x});
    		G[i+n].push_back({i+2*n,x});
    	}
    	for(int i=1;i<=m;i++){
    		int x,y,z;
    		cin>>x>>y>>z;
    		G[x].push_back({y,0});
    		G[x+n].push_back({y+n,0});
    		G[x+2*n].push_back({y+2*n,0});
    		if(z==2){
    			G[x].push_back({x,0});
    			G[y+n].push_back({x+n,0});
    			G[y+2*n].push_back({x+2*n,0});
    		}
    	}
    	for(int i=1;i<=3*n;i++)dis[i]=-inf;
    	dis[1]=0;
    	vis[1]=1;
    	queue<int>q;
    	q.push(1);
    	while(!q.empty()){
    		int now=q.front();
    		q.pop();
    		vis[now]=0;
    		for(auto x:G[now]){
    			int nex=x.to;
    			int val=x.w;
    			if(dis[now]+val>dis[nex]){
    				dis[nex]=dis[now]+val;
    				if(vis[nex])continue;
    				vis[nex]=1;
    				q.push(nex);
    			}
    		}
    	}
    	cout<<dis[n*3]<<"\n";
    	return 0;
    }
    
    

    信息

    ID
    1198
    时间
    2000ms
    内存
    512MiB
    难度
    (无)
    标签
    递交数
    0
    已通过
    0
    上传者