如果权重每移动第k个距离都会不断变化,如何找到从1到n的最短路径?
给出折边,边和k的数量。我们需要找到从1到n的最短路径。 将每千分之一的权重添加到路径之后。我们必须等待k秒才能再次移动(因此重量增加了k,但并非在所有情况下都如此)。
如果我们在旅行时达到了第k的重量,则以后会看到更改。 在旅行时,如果我们击中每个第k个值(表示4,8,依此类推),则仅等待k时间的剩余时间。例如:k = 4 graph:1 2 6(uvw),2 3 4.我们从1-> 2行进,但是行进时有4,所以我们等待4秒(但是行进6-所以2秒就已经在等待)。因此,我们仅需再等待2秒钟,使总重量为6 + 2 = 8,然后我们从2-> 3重新出发(因为这是最后一次,所以我们不必担心等待)。
我尝试修改djikstra,但这是不正确的。
int djikstra(int s,int n,int x,int k)
{
if(s==x) return 0;
for(int i=0;i<MAX;i++) d[i]=INF;
int temp=0;
priority_queue<pii,vector<pii>,greater<pii> > q;
q.push(pii(0,s));
int u,c,v,w;
d[s]=0;
while(!q.empty())
{
c=q.top().first;
u=q.top().second;
q.pop();
if(d[u]<c) continue;
if(u==x)
{return d[u];}
for(int i=0;i<g[u].size();i++)
{
v=g[u][i].first;
w=g[u][i].second;
if(d[u]%k==0) temp=0;
else temp=k-(d[u]%k);
if(v!=x)
{
// cout<<temp<<"\n";
if(w<=k)
{
int we=w;
if(temp!=0)
{
if(temp<=we)
{ we-=temp;
w+=k-(we%k);
temp=0;
}
else
{
temp-=w;
}
}
else
{
if(w%k==0)
{
w+=k;
}
else
{
temp=k-(we%k);
}
}
}
else
{
int wei=w;
wei-=temp;
if((wei/k)%2!=0)
{
w+=k-(wei%k);
temp=0;
}
else
{
if(wei%k==0) temp=0;
else temp=k-(wei%k);
}
}
}
if(d[v] > d[u]+w)
{
d[v]=d[u]+w;
q.push(pii(d[v],v));
}
}
}
return -1;
}
样本TC:
Inp:
5(n个顶点不存在)
4(k-kth个值)
6(无边缘)
1 2 3(m行定义无方向的边和权重)
1 3 4
2 3 3
3 4 2
4 5 2
3 5 4
输出:
12
说明:
1-> 3(8(4重量+ 4等待))
3-> 5(4)
8 + 4 = 12。