本人思路是跑一遍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;
}