在改变无向图的权重上应用djikstra

时间:2018-06-21 05:51:16

标签: algorithm graph shortest-path

如果权重每移动第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。

0 个答案:

没有答案