poj3013 邻接表+优先队列+Dij

把我坑到死的题

开始开题以为是全图连通是的最小值 ,以为是最小生成树,然后敲了发现不是,看了下别人的题意,然后懂了;

然后发现数据大,要用邻接表就去学了一下邻接表,然后又去学了下优先队列优化的dij;

这坑爹的题目我交了10几遍,也不知道错在哪里;后来知道了maxint要#define Maxint 10000000000;

然后long int 是过不了的,改成long long才能过 ,真是呵呵啊;

  1 #include<stdio.h>
  2 #include<string.h>
  3 #include<queue>
  4 using namespace std;
  5 #define Maxint 10000000000
  6 
  7 struct node
  8 {
  9     long long v;//后面点
 10     long long w;//
 11     long long next;//记录同一起点的下一条边的位置
 12 }edge[200005];
 13 
 14 long long n,m,index,nodeval[53003],dis[53003],vis[53003];
 15 
 16 long long pre[53003];//开始的顶点
 17 
 18 void add(long long x,long long y,long long z)
 19 {
 20     edge[index].v=y;
 21     edge[index].w=z;
 22     edge[index].next=pre[x];
 23     pre[x]=index++;
 24     
 25     /*edge[index].v=x;
 26     edge[index].w=z;
 27     edge[index].next=pre[y];
 28     pre[y]=index++;*/
 29     
 30 }
 31 
 32 struct Node
 33 {
 34     long long point,dist;
 35     bool operator<(const Node x) const
 36     {
 37         return x.dist<dist;
 38     }
 39 };
 40 
 41 void dij(int s)
 42 {
 43     priority_queue<Node> q;
 44     long long i,j;
 45     for(i=1;i<=n;i++)
 46     {
 47         dis[i]=Maxint;
 48     }
 49     dis[1]=0;
 50     Node cur;
 51     cur.point=1;
 52     cur.dist=0;
 53     q.push(cur);
 54     while(!q.empty())
 55     {
 56         Node tmp;
 57         tmp=q.top();
 58         q.pop();
 59         long int u=tmp.point;
 60         if(vis[u])
 61             continue;
 62         vis[u]=1;
 63         for(j=pre[u];j!=-1;j=edge[j].next)
 64         {
 65             if(!vis[edge[j].v]&&dis[edge[j].v]>dis[u]+edge[j].w)
 66             {
 67                 dis[edge[j].v]=dis[u]+edge[j].w;
 68                 cur.dist=dis[edge[j].v];
 69                 cur.point=edge[j].v;
 70                 q.push(cur);
 71             }
 72         }
 73     }
 74 }
 75 
 76 int main()
 77 {
 78     int i,j,t;
 79     scanf("%d",&t);
 80     while(t--)
 81     {
 82         scanf("%lld %lld",&n,&m);
 83         for(i=1;i<=n;i++)
 84             scanf("%ld",&nodeval[i]);
 85         index=1;
 86         memset(vis,0,sizeof(vis));
 87         memset(pre,-1,sizeof(pre));
 88         for(i=0;i<m;i++)
 89         {
 90             long long x,y,z;
 91             scanf("%lld %lld %lld",&x,&y,&z);
 92             if(x==y)continue;
 93             add(x,y,z);
 94             add(y,x,z);
 95         }
 96         dij(1);
 97         long long ans=0,flag=0;
 98         for(i=1;i<=n;i++)
 99         {
100             if(dis[i]==Maxint)
101             {
102                 flag=1;break;
103             }
104             ans+=(dis[i]*nodeval[i]);
105         }
106         if(flag)printf("No Answer\n");
107         else printf("%lld\n",ans);
108     }
109 }

 

posted @ 2015-05-05 09:06  sweat123  阅读(386)  评论(0编辑  收藏  举报