• poj 3013


    http://poj.org/problem?id=3013

    求最短路

    n<=50000  所以要用边来存储

    因为数据比较大要用到 longlong 型的  初始化时 INF要为1<<61

    虽然讲 m<50000 但是 edge数组开到50000 会RE  要 开到50000 *2 才行

    还有 不连通是要输出 0

    要注意的是就这些吧

    因为输出时ans 直接用到 %d  搞得wa  的都快抓狂了 我还以为是 别的地方错了 一直在看discuss里的评论 。。。

    后来女神把 %D改成 %lld    AC了

    嗷嗷

    #include<iostream>
    #include<stdio.h>
    #include<string.h>
    #include<queue>
    using namespace std;
    //#define INF 20000000000
    const long long INF=(long long) 1<<61-1;
    int w[150012],adj[150012],num,vis[150012];
    long long d[150012];
    struct E{int to;int next;int len;}edge[150012];
    queue<int > q;
    void add(int a,int b,int c)
    {
        edge[num].to =b;
        edge[num].next=adj[a];
        edge[num].len =c;
        adj[a]=num++;
    }
    
    void spfa(int s,int n)
    {
        int i,a,b;
        for(i=1;i<=n;i++)
            d[i]=INF;
        memset(vis,0,sizeof(vis));
        d[s]=0;
        q.push (s);
        vis[s]=1;
        while(!q.empty ())
        {
            a=q.front ();q.pop (); vis[a]=0;
            for(i=adj[a];i!=0;i=edge[i].next )
            {
                b=edge[i].to ;
                if(d[b]>d[a]+edge[i].len )
                {
                    d[b]=d[a]+edge[i].len ;
                    if(!vis[b])
                    {
                        q.push (b);
                        vis[b]=1;
                    }
                }
            }
        }
    }
    
    int main()
    {
        int t,n,m,i,j,a,b,c;
        scanf("%d",&t);
        while(t--)
        {
            scanf("%d%d",&n,&m);
            for(i=1;i<=n;i++)
                scanf("%d",&w[i]);
            memset(adj,0,sizeof(adj));
            num=1;
            
            while(m--)
            {
                scanf("%d%d%d",&a,&b,&c);
                add(a,b,c);
                add(b,a,c);        
            }
            spfa(1,n);
            long long ans=0;
            for(i=2;i<=n;i++)
            {
                if(d[i]==INF)
                    break;
                ans+=w[i]*d[i];
                
            }
            if(i<=n)
                printf("No Answer
    ");
            else
                printf("%lld
    ",ans);
        }
        return 0;
    }
  • 相关阅读:
    CF163E e-Government
    P2336 [SCOI2012]喵星球上的点名
    数据结构
    数字逻辑
    建筑制图与识图
    建筑施工
    电力系统分析
    现代物流基础
    电子商务网站设计与管理
    数字电子技术基础
  • 原文地址:https://www.cnblogs.com/assult/p/3227311.html
Copyright © 2020-2023  润新知