题目链接:FZU 2169 shadow
比较简单的最短路,SPFA搞定,白书上的dijkstra模版一直是编译错误,不知道怎么搞的。
#include <iostream>
#include <queue>
#include <cstdio>
#include <cstring>
using namespace std;
const int MAX_N = 100000 + 10;
const int INF = 0x3f3f3f3f;
struct Edge
{
int v, next;
};
int cnt, n, k, res, _count;
Edge e[MAX_N << 1];
int num[MAX_N], vis[MAX_N], head[MAX_N], d[MAX_N], has_army[MAX_N];
queue <int> Q;
void addEdge(int u, int v)
{
e[cnt].v = v;
e[cnt].next = head[u];
head[u] = cnt;
cnt++;
}
void SPFA(int src)
{
int u, v;
memset(vis, 0, sizeof(vis));
memset(d, INF, sizeof(d));
d[src] = 0;
queue<int> Q;
Q.push(src);
while(!Q.empty())
{
u = Q.front();
Q.pop();
vis[u] = false;
for(int i = head[u]; i != -1; i = e[i].next)
{
v = e[i].v;
if(d[v] > d[u] + 1)
{
d[v] = d[u] + 1;
if(!vis[v])
{
Q.push(v);
vis[v] = true;
}
}
}
}
}
int main()
{
while(scanf("%d%d", &n, &k)!= EOF)
{
cnt = res = _count = 0;
for(int i = 1; i <= n; i++)
{
scanf("%d", &num[i]);
if(num[i])
_count++;
}
memset(head, -1, sizeof(head));
for(int i = 0; i < k; i++)
scanf("%d", &has_army[i]);
int u, v;
for(int i = 0; i < n - 1; i++)
{
scanf("%d%d", &u, &v);
addEdge(u, v);
addEdge(v, u);
}
for(int i = 0; i < k; i++)
{
SPFA(has_army[i]);
for(int j = 1; j <= n; j++)
{
if(!num[j])
continue;
if(d[j] != INF)
{
res += num[j];
num[j] = 0;
_count--;
if(_count == 0)
break;
}
}
if(_count == 0)
break;
}
printf("%d\n", res);
}
return 0;
}
本文介绍了解决FZU2169shadow问题的C++实现,采用SPFA算法求解最短路径。通过实际代码展示了如何构造图结构、进行SPFA算法迭代及计算节点间最短距离。
776

被折叠的 条评论
为什么被折叠?



