FZU 2169 shadow

Posted 小小八

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了FZU 2169 shadow相关的知识,希望对你有一定的参考价值。

题目链接:shadow

先粘代码,明天补充。

#include<stdio.h>
#include<vector>
#include<string.h>
#include<queue>
#include<iostream>
#include<algorithm>
using namespace std;
const int maxn=100015;
const int inf=0x7fffffff;
int father[maxn];

struct Edge
{
    int to;
    int net;
} edge[maxn<<1];

int head[maxn],tot;
bool vis[maxn]; //spfa算法中 该点是否已经入队列
int dist[maxn]; // 源点到每个点的最短距离
int n; // 点的个数
int num[maxn]; // 每个地方的叛军数量
int point[maxn]; // YL军队所在城市
bool flag[maxn]; //叛军是否已经被消灭

void addedge(int u,int v)
{
    edge[tot].to=v;
    edge[tot].net=head[u];
    head[u]=tot++;
}

void spfa(int start)
{
    for(int i=0; i<=n; i++)
    {
        vis[i]=false;
        dist[i]=inf;
    }
    vis[start]=true;
    dist[start]=0;
    queue<int >que;

    que.push(start);
    while(!que.empty())
    {
        int u=que.front();
        que.pop();
        vis[u]=false;
        for(int i=head[u]; i!=-1; i=edge[i].net)
        {
            int v=edge[i].to;
            if(dist[v]>dist[u]+1)
            {
                dist[v]=dist[u]+1;
                if(!vis[v])
                {
                    father[v]=u;
                    vis[v]=true;
                    que.push(v);

                }
            }
        }

    }
}

int main()
{
    int k;
    while(scanf("%d%d",&n,&k)!=EOF)
    {
        for(int i=0; i<=n; i++)
        {
            father[i]=-1;
            flag[i]=false;
            head[i]=-1;
        }
        tot=0;
        for(int i=1; i<=n; i++)
            scanf("%d",&num[i]);


        for(int i=0; i<k; i++)
            scanf("%d",&point[i]);


        int u,v;
        for(int i=1; i<n; i++)
        {
            scanf("%d%d",&u,&v);
            addedge(u,v);
            addedge(v,u);
        }

        int ans=0;
        spfa(1);

        for(int i=0; i<k; i++)
        {
            int root=point[i];
            while(father[root]!=-1)
            {
                root=father[root];
                if(flag[root])
                    break;
                ans+=num[root];
                flag[root]=true;
            }

        }
        printf("%d\n",ans);
    }
    return 0;
}

  

以上是关于FZU 2169 shadow的主要内容,如果未能解决你的问题,请参考以下文章

P2169 正则表达式

洛谷 P2169 正则表达式

P2169 正则表达式

洛谷P2169正则表达式

LeetCode 2169. 得到 0 的操作数

选项值已更改 - ODBC 错误 2169