看了几篇题解,还有前面人的提交记录
感觉没什么问题啊,但不知为何一直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;
}