1 solutions

  • 1
    @ 2025-9-12 11:01:53

    学过最短路的都能做。

    #include<iostream>
    #include<cstdio>
    #include<vector>
    #include<queue>
    #include<cstring>
    #include<algorithm>
    using namespace std;
    const int NR=40001;
    vector<int> g[NR];
    bool f[NR];
    int n,dis1[NR],dis2[NR],dis3[NR];
    void spfa1()
    {
    	queue<int> q;
    	q.push(1);
    	memset(dis1,0x3f,sizeof(dis1));
    	dis1[1]=0;
    	f[1]=true;
    	while(!q.empty())
    	{
    		int u=q.front(),i;
    		q.pop();
    		f[u]=false;
    		for(i=0;i<g[u].size();i++)
    			if(dis1[u]+1<dis1[g[u][i]])
    			{
    				dis1[g[u][i]]=dis1[u]+1;
    				if(!f[g[u][i]])
    				{
    					q.push(g[u][i]);
    					f[g[u][i]]=true;
    				}
    			}
    	}
    	return; 
    }
    void spfa2()
    {
    	queue<int> q;
    	q.push(2);
    	memset(dis2,0x3f,sizeof(dis2));
    	dis2[2]=0;
    	memset(f,false,sizeof(f)); 
    	f[2]=true;
    	while(!q.empty())
    	{
    		int u=q.front(),i;
    		q.pop();
    		f[u]=false;
    		for(i=0;i<g[u].size();i++)
    			if(dis2[u]+1<dis2[g[u][i]])
    			{
    				dis2[g[u][i]]=dis2[u]+1;
    				if(!f[g[u][i]])
    				{
    					q.push(g[u][i]);
    					f[g[u][i]]=true;
    				}
    			}
    	}
    	return; 
    }
    void spfa3()
    {
    	queue<int> q;
    	q.push(n);
    	memset(dis3,0x3f,sizeof(dis3));
    	dis3[n]=0;
    	memset(f,false,sizeof(f));
    	f[n]=true;
    	while(!q.empty())
    	{
    		int u=q.front(),i;
    		q.pop();
    		f[u]=false;
    		for(i=0;i<g[u].size();i++)
    			if(dis3[u]+1<dis3[g[u][i]])
    			{
    				dis3[g[u][i]]=dis3[u]+1;
    				if(!f[g[u][i]])
    				{
    					q.push(g[u][i]);
    					f[g[u][i]]=true;
    				}
    			}
    	}
    	return; 
    }
    int main()
    {
    	int b,e,p,m,i;
    	cin>>b>>e>>p>>n>>m;
    	while(m--)
    	{
    		int u,v;
    		cin>>u>>v;
    		g[u].push_back(v);
    		g[v].push_back(u);
    	}
    	spfa1();
    	spfa2();
    	spfa3();
    	long long ans=1ll*b*dis1[n]+1ll*e*dis2[n];
    	for(i=1;i<=n;i++) ans=min(ans,1ll*b*dis1[i]+1ll*e*dis2[i]+1ll*p*dis3[i]);
    	cout<<ans;
    	return 0;
    }
    
    • 1

    Information

    ID
    2154
    Time
    1000ms
    Memory
    125MiB
    Difficulty
    5
    Tags
    # Submissions
    1
    Accepted
    1
    Uploaded By