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\n");
        else
            printf("%lld\n",ans);
    }
    return 0;
}

 

 

 

posted @ 2013-07-31 11:08  galaxy77  阅读(238)  评论(0编辑  收藏  举报