Esempio n. 1
0
        public static void Main(string[] args)
        {
            int n = ri;
            int k = ri;

            Dijkstra dk = new Dijkstra(n);

            for (int i = 0; i < k; i++)
            {
                int command = ri;
                if (command == 1)
                {
                    int  from = ri - 1;
                    int  to   = ri - 1;
                    long cost = rl;
                    dk.AddPath(from, to, cost);
                    dk.AddPath(to, from, cost);
                }
                else
                {
                    int from = ri - 1;
                    int to   = ri - 1;
                    dk.Solve(from);
                    long ans = dk.Costs[to];

                    if (ans == long.MaxValue)
                    {
                        ans = -1;
                    }

                    Console.WriteLine(ans);
                }
            }
        }
 public void NoPath()
 {
     var dk = new Dijkstra();
     dk.AddPath(0, 1, 1);
     dk.AddPath(2, 3, 1);
     dk.AddPath(3, 4, 1);
     dk.AddPath(4, 5, 1);
     Assert.AreEqual(Int32.MaxValue, dk.GetMinCost(0)[5]);
 }
        public void EdgeCase()
        {
            var dk = new Dijkstra();
            dk.AddPath(0, 1, 1);
            dk.AddPath(1, 2, 1);
            dk.AddPath(2, 3, 1);
            dk.AddPath(3, 4, 1);
            Assert.AreEqual(4, dk.GetMinCost(0)[4]);

            dk = new Dijkstra();
            dk.AddPath(0, 1, 1);
            Assert.AreEqual(1, dk.GetMinCost(0)[1]);
        }
Esempio n. 4
0
    void Solve()
    {
        io.i(out N, out M, out T);
        io.ini(out A, N);
        io.ini(out a, out b, out c, M);
        var dij = new Dijkstra(N, false);

        dij.AddPath(a, b, c.ToLong().ToArray());
        dij.Run(1);
        var dijR = new Dijkstra(N, false);

        dijR.AddPath(b, a, c.ToLong().ToArray());
        dijR.Run(1);
        var ans = 0L;

        N.Rep(i => {
            var I    = i + 1;
            var cost = dij.MinCost(I) + dijR.MinCost(I);
            if (cost < T)
            {
                var stay  = T - cost;
                var score = A[i] * stay;
                if (ans < score)
                {
                    ans = score;
                }
            }
        });
        ans.Prt();
    }
Esempio n. 5
0
    public static void Main(string[] args)
    {
        // dijkstra?r_1,r_2,...,r_n???????????????????????????next_permutation?????????????
        // ???????
        var nmr  = Console.ReadLine().SplittedStringToInt32List();
        var n    = nmr[0];
        var m    = nmr[1];
        var r    = nmr[2];
        var dijk = new Dijkstra(n, true);

        var rn = Console.ReadLine().SplittedStringToInt32List();

        for (int i = 0; i < m; i++)
        {
            var abc = Console.ReadLine().SplittedStringToInt32List();
            var a   = abc[0] - 1;
            var b   = abc[1] - 1;
            var c   = abc[2];
            dijk.AddPath(a, b, c);
            dijk.AddPath(b, a, c);;
        }
        var mincosts = new int[r][];

        for (int i = 0; i < r; i++)
        {
            mincosts[i] = dijk.GetMinCost(rn[i] - 1);
        }
        var permuse = Perm(Enumerable.Range(0, r));
        var mincost = INF;

        foreach (var item in permuse)
        {
            var ls   = item.ToArray();
            var cost = 0;
            for (int i = 0; i < r - 1; i++)
            {
                cost += mincosts[ls[i]][rn[ls[i + 1]] - 1];
            }

            mincost = Math.Min(mincost, cost);
        }
        Console.WriteLine(mincost);

        Console.ReadLine();
    }
        public void Ordinal()
        {
            var dk = new Dijkstra();

            dk.AddPath(0, 1, 3);
            dk.AddPath(0, 2, 1);
            dk.AddPath(1, 2, 2);
            dk.AddPath(1, 3, 1);
            dk.AddPath(1, 4, 2);
            dk.AddPath(2, 1, 1);
            dk.AddPath(2, 4, 4);
            dk.AddPath(3, 2, 2);
            dk.AddPath(3, 4, 4);

            Assert.AreEqual(4, dk.GetMinCost(0)[4]);
        }