zoukankan      html  css  js  c++  java
  • 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
    ");
    107         else printf("%lld
    ",ans);
    108     }
    109 }
  • 相关阅读:
    JavaWeb学习笔记
    IDEA环境配置里的一些error
    python库之argparse
    Burpsuite模块—-Intruder模块详解
    Burpsuite使用指南
    kali学习wiki
    用Flask 实现文件服务器(包含docker版本)
    ubuntu Nginx+tomcat 部署web项目
    python测试开发工具库汇总(转载)
    屏幕截图小工具的制作过程问题记录 python PIL pynput pyautogui pyscreeze
  • 原文地址:https://www.cnblogs.com/sweat123/p/4478225.html
Copyright © 2011-2022 走看看