80分求助
查看原帖
80分求助
53022
银杉水杉秃杉楼主2021/9/7 15:43

看了几篇题解,还有前面人的提交记录

感觉没什么问题啊,但不知为何一直80分

#include <bits/stdc++.h>
using namespace std;
const int N = 1010, M = 3010, inf = 0x3f3f3f3f;
int n, m, p, t;
int head[N], vis[N], f[N][1030], g[1030], s[15];
struct edge
{
    int to, next, val;
} e[M << 1];
queue<int> q;
void add(int u, int v, int w)
{
    e[++t] = (edge){v, head[u], w};
    head[u] = t;
}
void spfa(int s)
{
    memset(vis, 0, sizeof(vis));
    for (int i = 1; i <= n; i++)
        if (f[i][s] < inf)
        {
            q.push(i);
            vis[i] = 1;
        }
    while (!q.empty())
    {
        int u = q.front();
        q.pop();
        vis[u] = 0;
        for (int i = head[u]; i; i = e[i].next)
        {
            int v = e[i].to, w = e[i].val;
            if (f[v][s] > f[u][s] + w)
            {
                f[v][s] = f[u][s] + w;
                if (!vis[v])
                {
                    vis[v] = 1;
                    q.push(v);
                }
            }
        }
    }
}
int main()
{
    cin >> n >> m >> p;
    for (int i = 1; i <= m; i++)
    {
        int x, y, z;
        cin >> x >> y >> z;
        add(x, y, z);
        add(y, x, z);
    }
    memset(f, 0x3f, sizeof(f));
    memset(g, 0x3f, sizeof(g));
    for (int i = 1; i <= p; i++)
    {
        int x, y;
        cin >> x >> y;
        f[y][1 << (i - 1)] = 0;
        s[x] |= 1 << (i - 1);
    }
    for (int i = 1; i < (1 << p); i++)
    {
        for (int j = 1; j <= n; j++)
            for (int k = i; k; k = i & (k - 1))
                f[j][i] = min(f[j][i], f[j][k] + f[j][i ^ k]);
        spfa(i);
        bool fl = 1;
        for (int j = 1; j <= p; j++)
            if (s[j])
                if ((i & s[j]) != s[j] && (i & s[j]) != 0)
                    fl = 0;
        if (fl)
            for (int j = 1; j <= n; j++)
                g[i] = min(g[i], f[j][i]);
    }
    for (int i = 1; i < (1 << p); i++)
        for (int j = i; j; j = i & (j - 1))
            g[j] = min(g[j], g[i] + g[i ^ j]);
    cout << g[(1 << p) - 1] << endl;
    return 0;
}
2021/9/7 15:43
加载中...