hdu 4009 Transfer water(最小樹形圖:有向圖的最小產生樹模板)

來源:互聯網
上載者:User

標籤:style   blog   http   2014   os   代碼   

題目:

        連結:點擊開啟連結

題意:

        有n個村莊,要求使得每個村莊都能得到水的最小費用。每個村莊可以通過挖井或從其他村莊修水路獲得水。挖井的費用是房子的高度乘以X,修水道的費用和有向圖邊的起點和終點的高度有關。

思路:

代碼:

#include <iostream>#include <cstdio>#include <cmath>#include <cstring>using namespace std;#define inf 0x3f3f3f3fconst int maxm=1200000;const int maxn=1200;struct point{    int x,y,z;} p[maxn];struct edge{    int u,v,w;} e[maxm];int pre[maxn],id[maxn],vis[maxn],in[maxn];int n,m;void add(int u,int v,int w){    e[m].u=u,e[m].v=v,e[m++].w=w;}int dist(point a,point b){    return abs(a.x-b.x)+abs(a.y-b.y)+abs(a.z-b.z);}int directedMST(int root){    int res=0,nv=n,i;    while (1)    {        for (i=0; i<nv; i++)        {            in[i]=inf;        }        for (i=0; i<m; i++)        {            int u=e[i].u;            int v=e[i].v;            if (e[i].w<in[v]&&u!=v)            {                pre[v]=u;                in[v]=e[i].w;            }        }        for (i=0; i<nv; i++)        {            if (i==root)continue;            if (in[i]==inf)return -1;        }        int cntnode=0;        memset(id,-1,sizeof(id));        memset(vis,-1,sizeof(vis));        in[root]=0;        for (i=0; i<nv; i++)        {            res+=in[i];            int v=i;            while (vis[v]!=i&&id[v]==-1&&v!=root)            {                vis[v]=i;                v=pre[v];            }            if (v!=root&&id[v]==-1)            {                for (int u=pre[v]; u!=v; u=pre[u])                {                    id[u]=cntnode;                }                id[v]=cntnode++;            }        }        if (cntnode==0)            break;        for (i=0; i<nv; i++)        {            if (id[i]==-1)id[i]=cntnode++;        }        for (i=0; i<m; i++)        {            int v=e[i].v;            e[i].u=id[e[i].u];            e[i].v=id[e[i].v];            if (e[i].u!=e[i].v)            {                e[i].w-=in[v];            }        }        nv=cntnode;        root=id[root];    }    return res;}int main(void){    //freopen("input.txt","r",stdin);    int x,y,z;    while(scanf("%d%d%d%d",&n,&x,&y,&z)==4 && (n+x+y+z))    {        m=0;        n++;        for(int i=1; i<n; i++)        {            scanf("%d%d%d",&p[i].x,&p[i].y,&p[i].z);            add(0,i,x*p[i].z);        }        for(int i=1; i<n; i++)        {            int k,t;            scanf("%d",&k);            while(k--)            {                scanf("%d",&t);                if(t == i)                    continue;                int cost = dist(p[i],p[t])*y;                if(p[t].z > p[i].z)                    cost += z;                add(i,t,cost);            }        }        printf("%d\n",directedMST(0));    }    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.