ADO.NET,EF,Nhibernate比較

來源:互聯網
上載者:User

標籤:c   style   class   blog   code   a   

題目傳送門

題意:

給出一棵樹,求離每個節點最遠的點的距離

思路:

把無根樹轉化成有根樹分析,

對於上面那棵樹,要求距結點2的最長距離,那麼,就需要知道以2為頂點的子樹(藍色圈起的部分,我們叫它Tree(2)),距頂點2的最遠距離L1

還有知道2的父節點1為根節點的樹Tree(1)-Tree(2)部分(即紅色圈起部分),距離結點1的最長距離+dist(1,2) = L2,那麼最終距離結點2最遠的距離就是max{L1,L2}


f[i][0],表示頂點為i的子樹的,距頂點i的最長距離
f[i][1],表示Tree(i的父節點)-Tree(i)的最長距離+i跟i的父節點距離


要求所有的f[i][0]很簡單,只要先做一次dfs求每個結點到葉子結點的最長距離即可。
然後要求f[i][1], 可以從父節點遞推到子節點,

假設節點u有n個子節點,分別是v1,v2...vn
那麼
如果vi不是u最長距離經過的節點,f[vi][1] = dist(vi,u)+max(f[u][0], f[u][1])
如果vi是u最長距離經過的節點,那麼不能選擇f[u][0],因為這儲存的就是最長距離,要選擇Tree(u)第二大距離secondDist,
可得f[vi][1] = dist(vi, u) + max(secondDist, f[u][1])

貼一段自己AC的代碼:
<pre name="code" class="cpp">//求樹的最長路徑問題#include<cstdio>#include<cstring>#include<algorithm>using namespace std;#define MAXN 10100struct node{    int id;    int next;    int len;};struct node edge[MAXN*2];int head[MAXN];  //用來表示前端節點int d[MAXN][2];  //用來表示狀態集int smaxn[MAXN];//次大距離int smaxnid[MAXN]; //次最大值所經過的子節點int maxnid[MAXN];  //最大值所經過的子節點int ptr;void init(){    ptr=0;    memset(head,-1,sizeof(head));}void addEdge(int a,int b,int len)  //樹形DP模版和上一篇一樣的{    edge[ptr].id=b;    edge[ptr].next=head[a];    edge[ptr].len=len;    head[a]=ptr++;    edge[ptr].id=a;    edge[ptr].next=head[b];    edge[ptr].len=len;    head[b]=ptr++;}//求所有節點的d[v][0],同時記錄最大距離和第二大距離從哪個子節點過來,p是U的父節點,該函數用來求u節點到葉子節點void fds1(int u,int p){    d[u][0]=0;    smaxn[u]=0;    int i;    for(i=head[u];i!=-1;i=edge[i].next)    {        int v=edge[i].id;        if(v==p)    continue;        fds1(v,u);        if(smaxn[u]<d[v][0]+edge[i].len)        {            smaxn[u]=d[v][0]+edge[i].len;            smaxnid[u]=v;            if(smaxn[u]>d[u][0])            {                swap(smaxn[u],d[u][0]);                swap(smaxnid[u],maxnid[u]);            }        }    }}//求所有節點的d[v][1],u為v的父節點,p為u的父節點void fds2(int u,int p){    int i;    for(i=head[u];i!=-1;i=edge[i].next)    {        int v=edge[i].id;        if(v==p)            continue ;        if(v!=maxnid[u])            d[v][1]=edge[i].len+max(d[u][0],d[u][1]);        else            d[v][1]=edge[i].len+max(smaxn[u],d[u][1]);        fds2(v,u);    }}int main(){    //freopen("a.txt","r",stdin);    int n,i,v,len;    while(scanf("%d",&n)!=EOF)    {        init();        for(i=2;i<=n;i++)        {            scanf("%d%d",&v,&len);            addEdge(i,v,len);        }        fds1(1,-1);        fds2(1,-1);        for(i=1;i<=n;i++)            printf("%d\n",max(d[i][0],d[i][1]));    }}





聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在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.