QOJ.ac

QOJ

ID题目提交者结果用时内存语言文件大小提交时间测评时间
#188556#6894. Circuitneko_nyaaAC ✓1271ms5280kbC++142.3kb2023-09-25 23:54:422023-09-25 23:54:43

Judging History

This is the latest submission verdict.

  • [2023-09-25 23:54:43]
  • Judged
  • Verdict: AC
  • Time: 1271ms
  • Memory: 5280kb
  • [2023-09-25 23:54:42]
  • Submitted

answer

#include <bits/stdc++.h>
using namespace std;

#define int long long
const int M = 998244353;
const int INF = 1e18;

void solve()
{
    int n, m;
    cin >> n >> m;

    vector<vector<int>> adj(n, vector<int>(n, INF));
    while (m--)
    {
        int u, v, w;
        cin >> u >> v >> w;
        u--, v--;
        adj[u][v] = w;
    }

    int mincyclen = INF, cntmncyc = 0;
    for (int st = 0; st < n; st++)
    {
        vector<int> dist(n, INF);
        vector<int> cnt(n);
        dist[st] = 0;
        cnt[st] = 1;
        vector<bool> vis(n);
        for (int _ = 0; _ < n - st; _++)
        {
            int pick = st;
            for (int i = st; i < n; i++)
            {
                if (vis[i] < vis[pick] || (!vis[i] && dist[i] < dist[pick]))
                {
                    pick = i;
                }
            }

            vis[pick] = 1;
            for (int i = st; i < n; i++)
            {
                if (dist[pick] + adj[pick][i] < dist[i])
                {
                    dist[i] = dist[pick] + adj[pick][i];
                    cnt[i] = cnt[pick];
                }
                else if (dist[pick] + adj[pick][i] == dist[i])
                {
                    cnt[i] += cnt[pick];
                    cnt[i] %= M;
                }
            }
        }

        int cyclen = INF, cntcyc = 0;
        for (int i = st + 1; i < n; i++)
        {
            if (dist[i] + adj[i][st] < cyclen)
            {
                cyclen = dist[i] + adj[i][st];
                cntcyc = cnt[i];
            }
            else if (dist[i] + adj[i][st] == cyclen)
            {
                cntcyc += cnt[i];
                cntcyc %= M;
            }
        }

        if (cyclen < mincyclen)
        {
            mincyclen = cyclen;
            cntmncyc = cntcyc;
        }
        else if (cyclen == mincyclen)
        {
            cntmncyc += cntcyc;
            cntmncyc %= M;
        }
    }

    if (mincyclen >= INF)
    {
        cout << "-1 -1\n";
    }
    else
    {
        cout << mincyclen << ' ' << cntmncyc << '\n';
    }
}

signed main()
{
    ios::sync_with_stdio(0);
    cin.tie(0);

    int t;
    cin >> t;
    while (t--)
    {
        solve();
    }

    return 0;
}

详细

Test #1:

score: 100
Accepted
time: 1271ms
memory: 5280kb

input:

13
3 4
1 2 4
2 1 3
2 3 2
3 1 1
10 12
1 2 1
2 3 1
3 4 1
4 1 1
4 5 1
5 6 1
6 7 1
7 4 1
3 8 1
8 9 1
9 10 1
10 3 1
2 1
1 2 1
12 20
1 2 3
2 1 3
1 3 2
3 2 1
1 4 1
4 5 1
5 2 1
1 6 1
6 2 2
1 7 1
7 2 2
1 8 1
8 2 2
1 9 1
9 2 2
2 10 1
10 1 2
2 11 1
11 12 1
12 1 1
500 249500
1 2 1
1 3 2
1 4 3
1 5 4
1 6 5
1 7 6
...

output:

7 2
4 3
-1 -1
6 21
500 616118143
1002500000 124750
566 124750
2 124750
-1 -1
500098704 2
8500 207839182
116655401 5046
500000000000 1

result:

ok 13 lines