zoukankan      html  css  js  c++  java
  • Bzoj 2763: [JLOI2011]飞行路线 拆点,分层图,最短路,SPFA

    2763: [JLOI2011]飞行路线

    Time Limit: 10 Sec  Memory Limit: 128 MB
    Submit: 1694  Solved: 635
    [Submit][Status][Discuss]

    Description

    Alice和Bob现在要乘飞机旅行,他们选择了一家相对便宜的航空公司。该航空公司一共在n个城市设有业务,设这些城市分别标记为0到n-1,一共有m种航线,每种航线连接两个城市,并且航线有一定的价格。Alice和Bob现在要从一个城市沿着航线到达另一个城市,途中可以进行转机。航空公司对他们这次旅行也推出优惠,他们可以免费在最多k种航线上搭乘飞机。那么Alice和Bob这次出行最少花费多少?

    Input

    数据的第一行有三个整数,n,m,k,分别表示城市数,航线数和免费乘坐次数。
    第二行有两个整数,s,t,分别表示他们出行的起点城市编号和终点城市编号。(0<=s,t<n)
    接下来有m行,每行三个整数,a,b,c,表示存在一种航线,能从城市a到达城市b,或从城市b到达城市a,价格为c。(0<=a,b<n,a与b不相等,0<=c<=1000)
     

    Output

     
    只有一行,包含一个整数,为最少花费。

    Sample Input

    5 6 1
    0 4
    0 1 5
    1 2 5
    2 3 5
    3 4 5
    2 3 3
    0 2 100

    Sample Output

    8

    HINT

    对于30%的数据,2<=n<=50,1<=m<=300,k=0;


    对于50%的数据,2<=n<=600,1<=m<=6000,0<=k<=1;


    对于100%的数据,2<=n<=10000,1<=m<=50000,0<=k<=10.


    Source

     题解:
    分层图+SPFA
    分层图思想详见   IOI2004 国家集训队论文 肖天 
     1 #include<bits/stdc++.h>
     2 using namespace std;
     3 #define MAXN 10020
     4 #define INF 1e9
     5 struct node
     6 {
     7     int begin,end,value,next;
     8 }edge[100010];
     9 int cnt,Head[MAXN],q[MAXN],pay[MAXN][12],n,k;
    10 bool vis[MAXN];
    11 void addedge(int bb,int ee,int vv)
    12 {
    13     edge[++cnt].begin=bb;edge[cnt].end=ee;edge[cnt].value=vv;edge[cnt].next=Head[bb];Head[bb]=cnt;
    14 }
    15 void addedge1(int bb,int ee,int vv)
    16 {
    17     addedge(bb,ee,vv);addedge(ee,bb,vv);
    18 }
    19 int read()
    20 {
    21     int s=0,fh=1;char ch=getchar();
    22     while(ch<'0'||ch>'9'){if(ch=='-')fh=-1;ch=getchar();}
    23     while(ch>='0'&&ch<='9'){s=s*10+(ch-'0');ch=getchar();}
    24     return s*fh;
    25 }
    26 void SPFA(int bb,int ee)
    27 {
    28     int i,j,u,v,tmp,head,tail;
    29     memset(pay,0,sizeof(pay));//pay[i][j]为到i点使用j次免费的最小花费.
    30     for(i=1;i<=n;i++)
    31     {
    32         for(j=-1;j<=k;j++)pay[i][j]=INF;
    33     }
    34     for(j=0;j<=k;j++)pay[bb][j]=0;
    35     head=0;tail=1;q[tail]=bb;
    36     memset(vis,false,sizeof(vis));vis[bb]=true;
    37     while(head!=tail)
    38     {
    39         head++;if(head==10010)head=0;
    40         u=q[head];
    41         for(i=Head[u];i!=-1;i=edge[i].next)
    42         {
    43             v=edge[i].end;
    44             for(j=0;j<=k;j++)
    45             {
    46                 tmp=min(pay[u][j]+edge[i].value,pay[u][j-1]);
    47                 if(pay[v][j]>tmp)
    48                 {
    49                     pay[v][j]=tmp;
    50                     if(vis[v]==false)
    51                     {
    52                         vis[v]=true;
    53                         tail++;if(tail==10010)tail=0;
    54                         q[tail]=v;
    55                     }
    56                 }
    57             }
    58         }
    59         vis[u]=false;
    60     }
    61 }
    62 int main()
    63 {
    64     int m,s,t,i,a,b,c,mn;
    65     n=read();m=read();k=read();
    66     s=read();t=read();s++;t++;
    67     memset(Head,-1,sizeof(Head));cnt=1;
    68     for(i=1;i<=m;i++)
    69     {
    70         a=read();b=read();c=read();
    71         a++;b++;
    72         addedge1(a,b,c);
    73     }
    74     SPFA(s,t);
    75     mn=INF;
    76     for(i=0;i<=k;i++)mn=min(mn,pay[t][i]);
    77     printf("%d",mn);
    78     fclose(stdin);
    79     fclose(stdout);
    80     return 0;
    81 }
    View Code
  • 相关阅读:
    把文本文件数据快速导入Sql Server
    db4o, 看上去很美
    从《黑暗森林》事件谈下我对网络时代正版,盗版的看法
    viewDidUnload 和 dealloc 的区别(转)
    (翻译)cocoaasyncsocket 异步Socket
    iPhone的Socket编程使用开源代码之AsyncSocket(转)
    iphone之开源类库工具
    ObjectC 中各数据类型转换 NSData转NSString,Byte,UIImage
    iphone开发ObjectiveC新特性──类别与协议(转)
    让WebForm异步起来(转)
  • 原文地址:https://www.cnblogs.com/Var123/p/5281962.html
Copyright © 2011-2022 走看看