uestc 1717 Journey

來源:互聯網
上載者:User
#include <iostream>#include <cstdio>#include <algorithm>#include <cstring>#include <cmath>#include <queue>#include <set>#include <vector>using namespace std;const int N=100009;int n,m;int a,b,c,x,y;int len[N];int get[N];int vis[N],fa[N];vector<pair<int,int> > v[N],need[N];void dfs(int x,int f,int L)//處理出每個點到根的距離{    vis[x]=1;    len[x]=L;    for(int i=0;i<v[x].size();i++)    {        int y=v[x][i].first;        if(y==f)continue;        dfs(y,x,L+v[x][i].second);        fa[y]=x;    }}void dfs2(int x,int f,int id)//vis[x]=id表示節點x對應環上的點id{    vis[x]=id;    for(int i=0;i<v[x].size();i++)    {        int y=v[x][i].first;        if(y==f)continue;        dfs2(y,x,id);    }}void init(){    scanf("%d%d",&n,&m);    for(int i=1;i<=n;i++)    {        v[i].clear();        fa[i]=i;        vis[i]=0;    }    for(int i=1;i<=n-1;i++)    {        scanf("%d%d%d",&a,&b,&c);        v[a].push_back(make_pair(b,c));        v[b].push_back(make_pair(a,c));    }    scanf("%d%d%d",&a,&b,&c);    dfs(b,-1,0);//以b為根建樹    fa[b]=-1;    if(c>=len[a])//如果加入的邊比原先b-a的距離大,答案全為零    {        for(int i=1;i<=m;i++)        {            scanf("%d%d",&x,&y);            puts("0");        }    }    else    {        int x=a;        int id=3;        do //由a遍曆到b,將非環上的點對應成環上的點        {            vis[x]=2;            for(int i=0;i<v[x].size();i++)            {                int y=v[x][i].first;                if(y==fa[x]||vis[y]==2)continue;                dfs2(y,x,id);            }            get[id]=x;//get[id]=x表示vis[y]=id的點都對應點x            id++;            x=fa[x];        }while(x!=-1);                for(int i=1;i<=m;i++)        {            scanf("%d%d",&x,&y);            if(vis[x]!=2)  x=get[vis[x]];//如果不是環上的點,找到對應點            if(vis[y]!=2)   y=get[vis[y]];            if(len[y]<len[x])  swap(x,y);                        int tmp1=len[y]-len[x];            int tmp2=len[x]+c+len[a]-len[y];//比較繞新加入的邊是否可以減少距離            if(tmp2<tmp1)            {                printf("%d\n",tmp1-tmp2);            }            else            {                puts("0");            }        }    }}int main(){    int T;    scanf("%d",&T);    for(int ii=1;ii<=T;ii++)    {        printf("Case #%d:\n",ii);        init();    }return 0;}

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.