• 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 }
  • 相关阅读:
    [转]CR, LF, CR/LF区别与关系
    [转]Maven与nexus关系
    [转]Ubuntu默认使用root用户登录并免去输入密码
    [转]PL/SQL Developer 导入导出csv文件
    [转]关于胖客户端和瘦客户端的理解
    解决win7 安装完jdk7后,再安装jdk8出现的问题 has value '1.8', but '1.7' is required.
    [转]10 Awesome Indicator Applets for Ubuntu’s Unity Desktop
    简单的多对一传输ns2仿真
    论文阅读笔记 (2007-06-09)
    一个简单的ns2实验全过程
  • 原文地址:https://www.cnblogs.com/algorithms/p/2465052.html
Copyright © 2020-2023  润新知