刚才基础赛T3的求助
  • 板块学术版
  • 楼主zm0525
  • 当前回复2
  • 已保存回复2
  • 发布时间2023/8/6 20:00
  • 上次更新2023/11/3 05:31:56
查看原帖
刚才基础赛T3的求助
177656
zm0525楼主2023/8/6 20:00

本人思路是跑一遍Dijkstra,从终点跑到起点,应该是比较大众的思路吧。Subtask1和3过掉了,30pts。

题解里大神们的队列和DP看不懂。自己在比赛的时候想了很久,觉得可能是边权上出了问题,同一条边来回跑的代码不知道怎么实现。

另外问一句,无向图的数组邻接表(前向星)存图,我这种方法可行吗?有没有更简单的方法?

望大神指教,最好能在我的Dijkstra上面改

Code:

#include<bits/stdc++.h>
using namespace std;
int const M = 400000 + 5;
int first[M], next[M][3], dis[M];
bool book[M];
int qd, zd, n, m;
struct jl
{
	int d1;
	int d2;
	int gj;
}tu[M];
void cun()   //数组邻接表(前向星)存图
{
	for(int i = 1; i <= m; i++)
	{
		next[i][1] = first[tu[i].d1];
		next[i][2] = first[tu[i].d2];
		first[tu[i].d1] = i;
		first[tu[i].d2] = i;
	}
	return;
}
int searchmindot()
{
	int minx = 99999999, minn = 0;
	for(int i = 1; i <= n; i++)
	{
		if(dis[i] < minx && book[i] == 0)
		{
			minx = dis[i];
			minn = i;
		}
	}
	return minn;
}
void zdl()   //Dijkstra板子
{
	int dot = qd;
	for(int i = 1; i <= n; i++)
		dis[i] = 99999999;
	dis[qd] = 0;
	book[qd] = 1;
	for(int i = 1; i <= n; i++)
	{
		int bh = first[dot];
		while(bh != 0)
		{
			if(tu[bh].d1 == dot)
			{
				if(dis[dot] + tu[bh].gj / i < dis[tu[bh].d2])   //怀疑最可能出错的地方
					dis[tu[bh].d2] = dis[dot] + tu[bh].gj / i;
				bh = next[bh][1];
			}
			else
			{
				if(dis[dot] + tu[bh].gj / i < dis[tu[bh].d1])
					dis[tu[bh].d1] = dis[dot] + tu[bh].gj / i;
				bh = next[bh][2];
			}
		}
		dot = searchmindot();
		book[dot] = 1;
	}
	cout << dis[zd];
	return;
}
int main()
{
	cin >> n >> m >> zd >> qd;
	for(int i = 1; i <= m; i++)
		cin >> tu[i].d1 >> tu[i].d2 >> tu[i].gj;
	cun();
	zdl();
	return 0;
}

2023/8/6 20:00
加载中...