比赛 寒假集训4 评测结果 WWWWWWWWAW
题目名称 回忆 最终得分 10
用户昵称 exil 运行时间 0.145 s
代码语言 C++ 内存使用 6.22 MiB
提交时间 2026-02-28 12:56:58
显示代码纯文本
#include<bits/stdc++.h>
using namespace std; 
#define int long long
int shu[1005];
vector<int> v[1005];
vector<int> tu[1005][2];
int dian[1006];
int dian2[1006][1006];
priority_queue<pair<int,int>,vector<pair<int,int>> ,greater<pair<int,int>>>q;
int dis[200005];
int n,m;
bool pan[2000005];
void dsl(){
	dis[1]=0;
	q.push({0,1});
	//pan[s]=1;
	while(!q.empty()){
		int len=q.top().first;
		int dian=q.top().second;
		q.pop();
        if(pan[dian]==1)continue;
		pan[dian]=1;
		for(int i = 0;i<tu[dian][0].size();i++){
			if(pan[tu[dian][0][i]]==0 && dis[tu[dian][0][i]]>len+tu[dian][1][i] && len+tu[dian][1][i]<=0){
				dis[tu[dian][0][i]]=len+tu[dian][1][i];
				q.push({dis[tu[dian][0][i]],tu[dian][0][i]});
			}
		}
	}
}
signed main(){
	freopen("recall.in","r",stdin);
	freopen("recall.out","w",stdout);
    int c,si;
    cin>>c>>n>>m>>si;
    if(c==2){
        set<int> s;
        int ans=0;
        for(int i = 1;i<=n;i++)cin>>shu[i];
        for(int i = 1;i<=m;i++){
            int u,vi,x,y;
            cin>>u>>vi>>x>>y;
            v[u].push_back(vi);
            v[x].push_back(y);
            int l=s.size();
            s.insert(u);
            if(l!=s.size()){
                ans+=shu[u];
            }
            l=s.size();
            s.insert(vi);
            if(l!=s.size()){
                ans+=shu[vi];
            }
            l=s.size();
            s.insert(x);
            if(l!=s.size()){
                ans+=shu[x];
            }
            l=s.size();
            s.insert(y);
            if(l!=s.size()){
                ans+=shu[y];
            }
            
        }
        
        queue<int> q;
        q.push(1);
        dian[1]=1;
        int pan=0;
        while(!q.empty()){
            if(q.front()==n){
                pan=1;
                break;
            }
            for(int i = 0;i<v[q.front()].size();i++){
                if(dian[v[q.front()][i]]==0){
                    q.push(v[q.front()][i]);
                    dian[v[q.front()][i]]=1;
                }
            }
            q.pop();
            
        }
        if(pan==1)cout<<ans+si;
        else cout<<-1;
    }
    else if(c==3){
        int minn=0;
        for(int i = 1;i<=n;i++)cin>>shu[i];
        for(int i = 1;i<=n;i++){
            for(int j = 1;j<=n;j++)dian2[i][j]=INT_MAX;
        }
        
        for(int i = 1;i<=m;i++){
            int u,vi,x,y;
            cin>>u>>vi>>x>>y;
            dian2[u][vi]=shu[vi];
            if(dian2[u][vi]<0){
                dian2[u][vi]=abs(dian2[u][vi]);
            }
            else dian2[u][vi]=-dian2[u][vi];
            minn=min(minn,dian2[u][vi]);
        }
        for(int i = 1;i<=n;i++)dis[i]=INT_MAX;
        for(int i = 1;i<=n;i++){
            for(int j = 1;j<=n;j++){
                if(dian2[i][j]!=INT_MAX && i!=j){
                    
                    tu[i][0].push_back(j);
                    tu[i][1].push_back(dian2[i][j]);
                }
            }
        }
        dsl();
        if(shu[1]>=0 && dis[n]!=INT_MAX)cout<<abs(dis[n])+si+shu[1]<<endl;
        else cout<<-1;
        
        
        
    }
    else cout<<-1;
	return 0;
}