zoukankan      html  css  js  c++  java
  • POJ 3013

      最后推出来,建一个最小生成树的花费就是 所有点到1节点的最小距离*对应的点权之和。所有用spfa跑个最短路,然后求和即可。

      然后要判断一些节点是是否为0,为0的话最小花费就是0,还有这里无穷大要设置为0x3f3f3f3f3f,,因为可能会出现1节点到50000节点距离为49999*2^16差不多是3.2768e9这种情况,如果设置为inf为0x3f3f3f3f=1061109567,就比3.2768e9小了,那么在求1到50000的最短路径时,就会松弛不了,也就是说原本最短路径是3.2768e9,但是1到50000节点的初始值设置为了1061109567,就松弛失败了,那么1到50000的最短路径就求错了。还有就是用stl的vector被卡时间了,就用 了前向星

    #include<stdio.h>//能要考虑重边问
    #include<cstring>
    #include<queue>
    #include<iostream>
    #include<vector>
    using namespace std;
    #define  ull unsigned long long
    const int maxn=50005*2;
    #define inf 0x3f3f3f3f3f
    int n,m;
    struct edge
    {
        int u,v;
        int next;
        ull val;
    
    }e[maxn*2];
    int head[50005];
    ull dis[maxn];
    ull point[maxn];
    bool vis[maxn];
    void spfa(int v0)
    {
        memset(vis,false,sizeof(vis));
        for(int i=1;i<=n;i++) dis[i]=inf;
        dis[v0]=0;
        queue<int>q;
        q.push(v0);
        while(!q.empty())
        {
            int u=q.front();
            q.pop();
            vis[u]=false;
            for(int i=head[u];i!=-1;i=e[i].next)
            {
                int v=e[i].v;
                int w=e[i].val;
                if(dis[v]>dis[u]+w)
                {
                    dis[v]=dis[u]+w;
                    if(!vis[v])
                    {
                        q.push(v);
                        vis[v]=true;
                    }
                }
            }
        }
    }
    int main()
    {
        int t;
        scanf("%d",&t);
        int b;
        while(t--)
        {
            scanf("%d%d",&n,&m);
            for(int i=1;i<=n;i++)
            {
                scanf("%lld",&point[i]);
            }
            memset(head,-1,sizeof(head));
            b=0;
            for(int i=0;i<m;i++)
            {
                int u,v;
                ull w;
                scanf("%d%d%lld",&u,&v,&w);
                e[b].u=u;
                e[b].v=v;
                e[b].val=w;
                e[b].next=head[u];
                head[u]=b;
                b++;
                e[b].u=v;
                e[b].v=u;
                e[b].val=w;
                e[b].next=head[v];
                head[v]=b;
                b++;
            }
            if(n==0) {cout<<0<<endl;continue;}
            spfa(1);
            ull ans=0;
            int flag=0;
            for(int i=1;i<=n;i++)
            {
                if(dis[i]==inf)
                {
                    flag=1;
                    break;
                }
                ans+=dis[i]*point[i];
            }
            if(flag)
                printf("No Answer
    ");
            else
                printf("%lld
    ",ans);
    
        }
        return 0;
    
    }
    
  • 相关阅读:
    【Android Developers Training】 73. 布局变化的动画
    【Android Developers Training】 72. 缩放一个视图
    【Android Developers Training】 71. 显示翻牌动画
    svn更改地址怎么办
    python学习手册
    failed to bind pixmap to texture
    Ubuntu 12.04安装Google Chrome
    svn update 时总是提示 Password for '默认密钥' GNOME keyring: 输入密码
    重设SVN 的GNOME keyring [(null)] 的密码
    Nginx + uWSGI + web.py 搭建示例
  • 原文地址:https://www.cnblogs.com/eason9906/p/11755053.html
Copyright © 2011-2022 走看看