zoukankan      html  css  js  c++  java
  • POJ- 1511 Invitation Cards

    题目看懂了,然而没注意看数组,肿么辣么大~~天真的用了flody,超超超,,,

     

    就是有n个车站,m条路线,每条路线有一个价格。

    要求从起始站到每一站,然后再从每一站回去,求最少的钱数。

     

    看起来就是最短路径的问题,就是求单源点到其他各点的最但距离(票价),然后建个反向图,求的返回的钱数。也就是1到个点的价格加上各点返回1的价格。

     

    最短路径很多方法,Dijkstra算法,Bell-ford算法,floyd-washall,以及本题目用的spfa算法。

    由于数据比较大,Dijkstra算法 (o(n^2))   floyd-washall(o(n^3))肯定会超时。

     

    其实spfa比Dijkstra算法还要简单,代码更少,就是维护一个队列,队列里面放着可能经过的点,知道队列为空。

    ~~~然而目前我还不是太会用

     

    注意要用邻接表保存图,邻接矩阵会超内存的。

     

    天真代码:超超超~~~

     1 #include<stdio.h>
     2 #include<string.h>
     3 #include<math.h>
     4 #include<queue>
     5 #include<algorithm>
     6 #include<time.h>
     7 using namespace std;
     8 
     9 #define N 1550000
    10 #define INF 0x3f3f3f3f
    11 
    12 int P,maps[2500][2500];
    13 
    14 void Init()
    15 {
    16     for(int i=1;i<=P;i++)
    17         for(int j=1;j<=P;j++)
    18         maps[i][j]=(i==j)?0:INF;
    19 }
    20 
    21 void flody()
    22 {
    23     for(int k=1;k<=P;k++)
    24         for(int i=1;i<=P;i++)
    25             for(int j=1;j<=P;j++)
    26             maps[i][j]=min(maps[i][j],maps[i][k]+maps[k][j]);
    27 }
    28 
    29 int main()
    30 {
    31     int T,Q,i,a,b,price;
    32     scanf("%d", &T);
    33 
    34     while(T--)
    35     {
    36         scanf("%d %d", &P,&Q);
    37         Init();
    38 
    39         for(i=1;i<=Q;i++)
    40         {
    41             scanf("%d %d %d", &a,&b,&price);
    42             maps[a][b]=price;
    43         }
    44 
    45         flody();
    46 
    47         int sum=0;
    48         for(i=1;i<=P;i++)
    49             sum+=maps[1][i]+maps[i][1];
    50 
    51         printf("%d
    ", sum);
    52     }
    53     return 0;
    54 }

    AC代码:

      1 #include<stdio.h>
      2 #include<string.h>
      3 #include<math.h>
      4 #include<queue>
      5 #include<algorithm>
      6 #include<time.h>
      7 using namespace std;
      8 
      9 #define N 1550000
     10 #define INF 0x3f3f3f3f
     11 
     12 long long dist[N];
     13 int vis[N],head[N];
     14 int k;
     15 
     16 struct node
     17 {
     18     int u,v,nb;
     19     long long price;
     20 }edge[N];
     21 
     22 struct point
     23 {
     24    int a,b;
     25    long long price;
     26 }d[N];
     27 
     28 void Add(int a,int b,long long price,int k)
     29 {
     30     edge[k].u=a;
     31     edge[k].v=b;
     32     edge[k].price=price;
     33     edge[k].nb=head[a];
     34     head[a]=k;
     35 }
     36 
     37 long long spfa(int n)
     38 {
     39     queue<int>Q;
     40     Q.push(1);
     41     vis[1]=1;
     42 
     43     for(int i=1;i<=n;i++)
     44         dist[i]=INF;
     45     dist[1]=0;
     46 
     47     while(Q.size())
     48     {
     49         int x=Q.front();
     50         Q.pop();
     51         vis[x]=0;
     52 
     53         for(int j=head[x];j;j=edge[j].nb)
     54         {
     55             int u=edge[j].u;
     56             int v=edge[j].v;
     57             long long  price=edge[j].price;
     58 
     59             if(dist[u]+price<dist[v])
     60             {
     61                 dist[v]=dist[u]+price;
     62                 if(vis[v]==0)
     63                 {
     64                     Q.push(v);
     65                     vis[v]=1;
     66                 }
     67             }
     68         }
     69     }
     70     long long  sum=0;
     71 
     72     for(int i=1;i<=n;i++)
     73         sum+=dist[i];
     74 
     75     return sum;
     76 }
     77 
     78 int main()
     79 {
     80     int T,q,i,P;
     81     scanf("%d", &T);
     82 
     83     while(T--)
     84     {
     85         scanf("%d %d", &P,&q);
     86         memset(head,0,sizeof(head));
     87 
     88         for(i=1;i<=q;i++)
     89         {
     90             scanf("%d %d %lld", &d[i].a,&d[i].b,&d[i].price);
     91             Add(d[i].a,d[i].b,d[i].price,i);
     92         }
     93 
     94      long long sum;
     95 
     96         sum=spfa(P);
     97 
     98         memset(head,0,sizeof(head));
     99         for(i=1;i<=q;i++)
    100             Add(d[i].b,d[i].a,d[i].price,i);
    101 
    102         sum+=spfa(P);
    103 
    104         printf("%lld
    ", sum);
    105     }
    106     return 0;
    107 }
  • 相关阅读:
    文本分类的研究学习
    Python中的TfidfVectorizer参数解析
    Newsgroups数据集介绍
    鸢尾花数据读取的总结
    Knapsack Problems
    3.1.6 Stamps
    3.1.5 Contact
    3.1.4 Shaping Regions
    3.1.3 Humble Numbers
    3.1.2 Score Inflation
  • 原文地址:https://www.cnblogs.com/weiyuan/p/5702369.html
Copyright © 2011-2022 走看看