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 }

 

你可能感兴趣的:(优先队列)