zoukankan      html  css  js  c++  java
  • bzoj1266 [AHOI2006]上学路线route floyd建出最短路图+最小割

    1266: [AHOI2006]上学路线route

    Time Limit: 3 Sec  Memory Limit: 162 MB
    Submit: 2490  Solved: 898
    [Submit][Status][Discuss]

    Description

    可可和卡卡家住合肥市的东郊,每天上学他们都要转车多次才能到达市区西端的学校。直到有一天他们两人参加了学校的信息学奥林匹克竞赛小组才发现每天上学的乘车路线不一定是最优的。 可可:“很可能我们在上学的路途上浪费了大量的时间,让我们写一个程序来计算上学需要的最少时间吧!” 合肥市一共设有N个公交车站,不妨将它们编号为1…N的自然数,并认为可可和卡卡家住在1号汽车站附近,而他们学校在N号汽车站。市内有M条直达汽车路线,执行第i条路线的公交车往返于站点pi和qi之间,从起点到终点需要花费的时间为ti。(1<=i<=M, 1<=pi, qi<=N) 两个人坐在电脑前,根据上面的信息很快就编程算出了最优的乘车方案。然而可可忽然有了一个鬼点子,他想趁卡卡不备,在卡卡的输入数据中删去一些路线,从而让卡卡的程序得出的答案大于实际的最短时间。而对于每一条路线i事实上都有一个代价ci:删去路线的ci越大卡卡就越容易发现这个玩笑,可可想知道什么样的删除方案可以达到他的目的而让被删除的公交车路线ci之和最小。 [任务] 编写一个程序:  从输入文件中读取合肥市公交路线的信息;  计算出实际上可可和卡卡上学需要花费的最少时间;  帮助可可设计一个方案,删除输入信息中的一些公交路线,使得删除后从家到学校需要的最少时间变大,而被删除路线的ci和最小;向输出文件输出答案。

    Input

    输入文件中第一行有两个正整数N和M,分别表示合肥市公交车站和公交汽车路线的个数。以下M行,每行(第i行,总第(i+1)行)用四个正整数描述第i条路线:pi, qi, ti, ci;具体含义见上文描述。

    Output

    输出文件最多有两行。 第一行中仅有一个整数,表示从可可和卡卡家到学校需要的最短时间。 第二行输出一个整数C,表示Ci之和

    Sample Input

    6 7
    1 2 1 3
    2 6 1 5
    1 3 1 1
    3 4 1 1
    4 6 1 1
    5 6 1 2
    1 5 1 4

    Sample Output

    题目大意:给定一张图,每条边有一个长度和一个花费,要求删掉一些边使1到n的最短路变长,求最小花销

    首先求出最短路(用什么求随便,反正数据范围小),然后将所有在最短路上的边连到新图中,求最小割就是答案

    2
    5

    HINT

    2<=N<=500, 1<=M<=124 750, 1<=ti, ci<=10 000
    合肥市的公交网络十分发达,你可以认为任意两个车站间都可以通过直达或转车互相到达,当然如果在你提供的删除方案中,家和学校无法互相到达,那么则认为上学需要的最短为正无穷大:这显然是一个合法的方案。

    Source

      1 #include <queue>
      2 #include <cstdio>
      3 #include <cstring>
      4 #include <iostream>
      5 #include <algorithm>
      6 #define N 505
      7 #define M 250007
      8 #define inf 0x3f3f3f3f
      9 using namespace std;
     10 struct YYC
     11 {
     12     int u,v,len,cost,next;
     13 }e[M],road[M>>1];
     14 int head[N],cnt;
     15 inline void add(int u,int v,int len)
     16 {
     17     e[++cnt].v=v;
     18     e[cnt].len=len;
     19     e[cnt].next=head[u];
     20     head[u]=cnt;
     21 }
     22 int dist[N];
     23 bool in[N];
     24 queue<int>q;
     25 void spfa(int s)
     26 {
     27     while(!q.empty())q.pop();
     28     memset(dist,0x3f,sizeof(dist));
     29     int i,u,v;
     30     q.push(s),dist[s]=0,in[s]=1;
     31     while(!q.empty())
     32     {
     33         u=q.front(),q.pop(),in[u]=0;
     34         for(i=head[u];i;i=e[i].next)
     35         {
     36             v=e[i].v;
     37             if(dist[v]>dist[u]+e[i].len)
     38             {
     39                 dist[v]=dist[u]+e[i].len;
     40                 if(!in[v])q.push(v),in[v]=1;
     41             }
     42         }
     43     }
     44     return ;
     45 }
     46 int s,t,d[N];
     47 bool bfs()
     48 {
     49     memset(d,0,sizeof(d));
     50     while(!q.empty())q.pop();
     51     int i,u,v;
     52     q.push(s);
     53     d[s]=1;
     54     while(!q.empty())
     55     {
     56         u=q.front(),q.pop();
     57         for(i=head[u];i;i=e[i].next)
     58         {
     59             v=e[i].v;
     60             if(!d[v]&&e[i].len)
     61             {
     62                 d[v]=d[u]+1;
     63                 if(v==t)return 1;
     64                 q.push(v);
     65             }
     66         }
     67     }
     68     return 0;
     69 }
     70 int dinic(int x,int flow)
     71 {
     72     if(x==t)return flow;
     73     int i,v,remain=flow,k;
     74     for(i=head[x];i&&remain;i=e[i].next)
     75     {
     76         if(d[v=e[i].v]==d[x]+1&&e[i].len)
     77         {
     78             k=dinic(v,min(remain,e[i].len));
     79             if(!k)d[v]=0;
     80             e[i].len-=k,e[i^1].len+=k;
     81             remain-=k;
     82         }
     83     }
     84     return flow-remain;
     85 }
     86 int n,m;
     87 int main()
     88 {
     89     int i,j,k;
     90     int a,b,c,d;
     91     scanf("%d%d",&n,&m);
     92     for(i=1;i<=m;i++)
     93     {
     94         scanf("%d%d%d%d",&road[i].u,&road[i].v,&road[i].len,&road[i].cost);
     95         add(road[i].u,road[i].v,road[i].len);
     96         add(road[i].v,road[i].u,road[i].len);
     97     }
     98     spfa(1);
     99     cnt=1;
    100     memset(head,0,sizeof(head));
    101     for(i=1;i<=m;i++)
    102     {
    103         if(dist[road[i].u]+road[i].len==dist[road[i].v])add(road[i].u,road[i].v,road[i].cost),add(road[i].v,road[i].u,0);
    104         if(dist[road[i].v]+road[i].len==dist[road[i].u])add(road[i].v,road[i].u,road[i].cost),add(road[i].u,road[i].v,0);
    105     }
    106     s=1,t=n;
    107     int maxflow=0;
    108     while(bfs())maxflow+=dinic(s,inf);
    109     printf("%d
    %d
    ",dist[n],maxflow);
    110 }
  • 相关阅读:
    Cannot get a NUMERIC value from a STRING cell? 已解决
    Android Studio快捷键大全
    mysql索引
    eclipse中出现错误 Syntax error, insert "}" to complete Block
    function
    IGS OPC UA 配置
    IFIX 5.9 历史数据 曲线 (非SQL模式)
    IFIX 5.9 报警存sql
    IFIX 数据源 节点 标签 域名
    IFIX 目录结构
  • 原文地址:https://www.cnblogs.com/fengzhiyuan/p/8487819.html
Copyright © 2011-2022 走看看