mxqz dijkstra板子
查看原帖
mxqz dijkstra板子
541254
BugGod楼主2023/10/28 18:19
#include<bits/stdc++.h>
using namespace std;
#define int long long
struct edge
{
	int to,cost;
};
typedef pair<int,int>P;
int n,a,b,c,d,dist[2][1010],ans=9e18,vis[1010];
vector<edge>G[2][1010];//G[0][i]:car;G[1][i]:train
void Dijk(int id,int s)
{
	priority_queue<P>q;
	memset(dist,0x3f3f3f3f,sizeof(dist));
	memset(vis,0,sizeof(vis));
	dist[id][s]=0;
	vis[s]=1;
	q.push(make_pair(0,s));
	while(q.size())
	{
		P now=q.top();
		q.pop();
		int v=now.second,k=now.first;
		if(vis[v])continue;
		vis[v]=1;
		for(int i=0;i<G[id][v].size();i++)
		{
			edge e=G[id][v][i];
			int to=e.to,cost=e.cost;
			if(dist[id][to]>dist[id][v]+cost)
			{
				dist[id][to]=dist[id][v]+cost;
				q.push(make_pair(-dist[id][to],to));
			}
		}
	}
}
signed main()
{
	cin>>n>>a>>b>>c;
	for(int i=1;i<=n;i++)
	{
		for(int j=1;j<=n;j++)
		{
			cin>>d;
			G[0][i].push_back((edge){j,d*a});
			G[1][i].push_back((edge){j,d*b+c});
		}
	}
	Dijk(0,1);
	ans=dist[0][n];
	for(int i=2;i<=n;i++)
	{
		int di=dist[0][i];
		Dijk(1,i);
		di+=dist[1][n];
		ans=min(ans,di);
	}
	cout<<ans;
	return 0;
}

总是输出极大值。

2023/10/28 18:19
加载中...