zoukankan      html  css  js  c++  java
  • POJ1511(Invitation Cards)

    题目链接

    最短路的题,这题时间限制较严,第一次用dijkstra果断挂掉,后来改用SPFA写,由于我用的数据结构是动态链表,所以还是TLE,改为静态链表后就AC了。在这个过程中还贡献了一次WA,因为最后结果用32位会溢出,题中说的总价格不会超过1000000000是单个最短路不会超,而最后的结果是n-1个结点的最短路之和。

    View Code
     1 #include <stdio.h>
     2 #include <stdlib.h>
     3 #include <memory.h>
     4 #define INF 1000000001
     5 #define N 1000001
     6 #define MIN(a,b) ((a)<(b)?(a):(b))
     7 struct node
     8 {
     9     int v,w;
    10     struct node *next;
    11 };
    12 int cnt;
    13 struct node edge[2*N];
    14 struct node *a[N],*b[N];
    15 int dist[N],n,m;
    16 int queue[N],front,rear;
    17 char vis[N];
    18 void addEdge(int u,int v,int w)
    19 {
    20     struct node *p,*q;
    21     p=&edge[cnt++];
    22     q=&edge[cnt++];
    23     p->v=v,p->w=w;
    24     p->next=a[u],a[u]=p;
    25     q->v=u,q->w=w;
    26     q->next=b[v],b[v]=q;
    27 }
    28 void SPFA(int u,struct node *list[])
    29 {
    30     int i,v;
    31     struct node *p;
    32     front=rear=0;
    33     memset(vis,0,sizeof(vis));
    34     for(i=0;i<n;i++)    dist[i]=(i==u?0:INF);
    35     queue[rear++]=u;
    36     while(front!=rear)
    37     {
    38         i=queue[front],front=(front+1)%N;
    39         vis[i]=0;
    40         for(p=list[i];p;p=p->next)
    41         {
    42             v=p->v;
    43             if(dist[v]>dist[i]+p->w)
    44             {
    45                 dist[v]=dist[i]+p->w;
    46                 if(!vis[v])
    47                 {
    48                     vis[v]=1;
    49                     queue[rear]=v,rear=(rear+1)%N;
    50                 }
    51             }
    52         }
    53     }
    54 }
    55 int main()
    56 {
    57     int i,j,k,d,t;
    58     long long ans;
    59     scanf("%d",&t);
    60     while(t--)
    61     {
    62         scanf("%d%d",&n,&m);
    63         cnt=0;
    64         for(i=0;i<m;i++)
    65         {
    66             scanf("%d%d%d",&j,&k,&d);
    67             j--,k--;
    68             addEdge(j,k,d);
    69         }
    70         ans=0;
    71         SPFA(0,a);
    72         for(i=1;i<n;i++)   ans+=dist[i];
    73         SPFA(0,b);
    74         for(i=1;i<n;i++)   ans+=dist[i];
    75         printf("%lld\n",ans);
    76         memset(a,0,sizeof(a));
    77         memset(b,0,sizeof(b));
    78     }
    79     return 0;
    80 }
  • 相关阅读:
    hduoj 1865 1string 【大数】【菲波那切数列】
    poj 1664 放苹果【M的N划分】
    新年第一篇
    3、XCode: 如何添加自定义代码片段
    2、文件夹
    1、获取当前屏幕显示的页面
    运算符
    表单数据接收
    PHP进入MySQL数据库
    my SQL认识和进入
  • 原文地址:https://www.cnblogs.com/algorithms/p/2465052.html
Copyright © 2011-2022 走看看