您的位置:首页 > 其它

FZU 2169 shadow(最短路)

2014-05-02 23:54 375 查看
题目链接: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;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: