3 条题解

  • 1
    @ 2026-10-4 16:59:14

    鸡汤来喽!
    题解🔗传送门

    • 1
    • 1
      @ 2026-10-4 14:30:51

      小青君是什么东西啊

      狮山代码:

      #include<bits/stdc++.h>
      #define int long long
      #define N 200005 
      using namespace std;
      int u[N],v[N],w[N];
      int c[N];
      vector<int>b[N];
      vector<pair<int,int> >a[N];
      int wx[N];
      bool vis[N];
      int n,m,k,s;
      int p,q;
      int t[N];
      struct node
      {
      	int x,step;	
      };
      void bfs()
      {
      	queue<node>qq;
      	for(int i=1;i<=k;i++)
      	{
      		qq.push({c[i],0});
      		wx[c[i]]=-1;
      		vis[c[i]]=1;
      	}
      	while(!qq.empty())
      	{
      		node tt=qq.front();
      		qq.pop();
      		if(tt.step>=s)continue;
      		int x=tt.x;
      		for(int i=0;i<b[x].size();i++)
      		{
      			int y=b[x][i];
      			if(!vis[y]&&wx[y]==0)
      			{
      				vis[y]=1;
      				wx[y]=1;
      				qq.push({y,tt.step+1});
      			}
      		}
      	}
      }
      void dijkstra(int x)
      {
      	memset(vis,0,sizeof(vis));
      	for(int i=0;i<=200000;i++)
      	{
      		t[i]=0x3f3f3f3f3f3f3f3f;
      	}
      	priority_queue<pair<int,int>,vector<pair<int,int> >,greater<pair<int,int> > >qq;
      	qq.push({0LL,x});
      	t[x]=0LL;
      	while(!qq.empty())
      	{
      		int t2=qq.top().second;
      		qq.pop();
      		if(vis[t2])continue;
      		vis[t2]=1;
      		for(int i=0;i<a[t2].size();i++)
      		{
      			int y=a[t2][i].first;
      			int z=a[t2][i].second;
      			if(wx[y]==-1)continue;
      			if(t[y]>t[t2]+z)
      			{
      				t[y]=t[t2]+z;
      				qq.push({t[y],y});
      			}
      		}
      	}
      }
      signed main()
      {
      	ios::sync_with_stdio(false);
      	cin.tie(0);
      	cout.tie(0);
      	cin>>n>>m>>k>>s;
      	cin>>p>>q;
      	int i;
      	for(i=1;i<=k;i++)
      	{
      		cin>>c[i];
      	}
      	for(i=1;i<=m;i++)
      	{
      		cin>>u[i]>>v[i];
      		b[u[i]].push_back(v[i]);
      		b[v[i]].push_back(u[i]);
      	}
      	bfs();
      	/*for(i=1;i<=n;i++)
      	{
      		for(int j=0;j<b[i].size();j++)
      		{
      			cout<<b[i][j]<<' ';
      		}
      		cout<<endl;
      	}*/
      	for(i=1;i<=n;i++)
      	{
      		if(wx[i]==-1)continue;
      		for(int j=0;j<b[i].size();j++)
      		{
      			int x=i,y=b[i][j];
      			if(wx[y]==-1)continue;
      			else if(wx[y]==1)
      			{
      				a[x].push_back({y,q});
      			}
      			else
      			{
      				a[x].push_back({y,p});
      			} 
      		}
      	}
      	/*for(i=1;i<=n;i++)
      	{
      		for(int j=0;j<a[i].size();j++)
      		{
      			cout<<a[i][j].first<<' ';
      		}
      		cout<<endl;
      	}*/
      	dijkstra(1);
      	if(wx[n]==1)
      		cout<<t[n]-q;
      	else cout<<t[n]-p;
      	cout<<endl;
      }
      
      

      怎么这题这么多90,100的啊

      • 1

      信息

      ID
      3165
      时间
      1000ms
      内存
      256MiB
      难度
      9
      标签
      (无)
      递交数
      100
      已通过
      7
      上传者