1 条题解

  • 0
    @ 2023-10-18 10:01:26

    C++ :

    #include<bits/stdc++.h>
    using namespace std;
    const int N=1010,C=110,M=20010;
    int n,m;
    int h[N],e[M],w[M],ne[M],idx;
    int price[N];
    int dist[N][C]; //储存起点到每个点的距离
    bool st[N][C]; //标记每个点是否用过
    struct Ver{ //距离排序的结构体
    	int d,u,c;
    	bool operator<(const Ver& W)const
    	{
    		return d>W.d;
    	}
    };
    void add(int a,int b,int c) //加边
    {
    	e[idx]=b,w[idx]=c,ne[idx]=h[a],h[a]=idx++;
    }
    int dijkstra(int start,int end,int cap)
    {
    	memset(dist,0x3f,sizeof dist); //距离设为无穷大
    	memset(st,0,sizeof st); //清空标记
    	priority_queue<Ver> heap; //堆优化的dijkstra的小根堆
    	heap.push({0,start,0}); //起点入队
    	dist[start][0]=0; //初始化起点距离
    	while(heap.size())
    	{
    		Ver t=heap.top(); 
    		heap.pop();
    		if(t.u==end) return t.d; //找到终点
    		if(st[t.u][t.c]) continue; //冗余备份
    		st[t.u][t.c]=1;
    		if(t.c<cap) //加油
    		{
    			if(dist[t.u][t.c+1]>t.d+price[t.u])
    			{
    				dist[t.u][t.c+1]=t.d+price[t.u];
    				heap.push({dist[t.u][t.c+1],t.u,t.c+1});
    			}
    		}
    		for(int i=h[t.u];i!=-1;i=ne[i]) //走到下一个加油站
    		{
    			int j=e[i];
    			if(t.c>=w[i]) //油量够了才能走
    			{
    				if(dist[j][t.c-w[i]]>t.d) //通过当前走到后距离更优
    				{
    					dist[j][t.c-w[i]]=t.d;
    					heap.push({dist[j][t.c-w[i]],j,t.c-w[i]});
    				}
    			}
    		}
    	}
    	return -1;
    }
    int main()
    {
    	scanf("%d%d",&n,&m);
    	memset(h,-1,sizeof h);
    	for(int i=0;i<n;i++)
    	{
    		scanf("%d",&price[i]);
    	}
    	for(int i=0;i<m;i++)
    	{
    		int a,b,c;
    		scanf("%d%d%d",&a,&b,&c);
    		add(a,b,c);
    		add(b,a,c);
    	}
    	int query;
    	scanf("%d",&query);
    	while(query--)
    	{
    		int a,b,c;
    		scanf("%d%d%d",&c,&a,&b);
    		int t=dijkstra(a,b,c);
    		if(t==-1) printf("impossible\n");
    		else printf("%d\n",t);
    	 } 
    	return 0;
    }
    
    
    • 1

    信息

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