codeforces 813C. The Tag Game

来源:互联网 发布:pp助手无法安装软件 编辑:程序博客网 时间:2024/06/06 08:26

思路:计算出所有点到1号点的最短距离,到x号点的最短距离,然后找到一些这样的点,这个点到x点的距离小于到1号点的距离,然后选出这些点中距离1号点最远的点就是结果。

#include <cstdio>#include <cstring>#include <vector>#include <queue>using std::priority_queue;using std::vector;const int MAXN = 2e5+10;struct qnode{    int v,c;    qnode(int _v = 0, int _c = 0):v(_v),c(_c) {}    bool operator <(const qnode &r) const    {        return c>r.c;    }};struct Edge{    int v,cost;    Edge(int _v = 0, int _cost = 0):v(_v),cost(_cost) {}};vector<Edge> E[MAXN];const int INF = 0x3f3f3f3f;int n,x;//dist[0] ->distA//dist[1] ->distBint dist[2][MAXN];bool vis[MAXN];void Dijkstra(int n, int start, int index){    memset(vis,false,sizeof(vis));    for(int i=1; i<=n; i++)        dist[index][i]=INF;    priority_queue<qnode> que;    while(!que.empty()) que.pop();    dist[index][start]=0;    que.push(qnode(start,0));    qnode tmp;    while(!que.empty())    {        tmp=que.top();        que.pop();        int u=tmp.v;        if(vis[u])continue;        vis[u]=true;        for(int i=0; i<E[u].size(); i++)        {            int v=E[tmp.v][i].v;            int cost=E[u][i].cost;            if(!vis[v]&&dist[index][v]>dist[index][u]+cost)            {                dist[index][v]=dist[index][u]+cost;                que.push(qnode(v,dist[index][v]));            }        }    }}void addedge(int u,int v,int w){    E[u].push_back(Edge(v,w));    E[v].push_back(Edge(u,w));}int main(){    int a,b;    scanf("%d %d",&n,&x);    for(int i = 0; i < n-1; ++i)    {        scanf("%d %d",&a,&b);        addedge(a,b,1);    }    Dijkstra(n,1,0);    Dijkstra(n,x,1);    int res = 0;    for(int i = 2; i <= n; ++i)    {        if(dist[0][i] > dist[1][i])        {            if(dist[0][i] > res)                res = dist[0][i];        }    }    printf("%d\n",res*2);    return 0;}
原创粉丝点击