zoukankan      html  css  js  c++  java
  • bzoj1877

    裸的费用流。。拆点就好了

     1 #include<cstdio>
     2 #include<iostream>
     3 #include<cstring>
     4 #include<cmath>
     5 #include<ctime>
     6 #include<cstdlib>
     7 #include<algorithm>
     8 #include<vector>
     9 #include<queue>
    10 #define rep(i,l,r) for(int i=l;i<(r);i++)
    11 #define Rep(i,l,k) rep(i,l,e[k].size())
    12 #define clr(a,x) memset(a,x,sizeof(a))
    13 typedef long long ll;
    14 using namespace std;
    15 struct edge{
    16     int v,w,c;
    17 };
    18 struct Ans{
    19     int flow,cost;
    20 };
    21 const int maxn=1009,maxm=100009,inf=0x3fffffff;
    22 int s,t,n,m,cnt=0,d[maxn],a[maxn],b[maxn];
    23 bool p[maxn];
    24 edge E[maxm];
    25 vector<int>e[maxn];
    26 void addedge(int u,int v,int w,int c){
    27     edge ed;
    28     ed.v=v;ed.w=w;ed.c=c;
    29     e[u].push_back(cnt);E[cnt++]=ed;
    30     ed.v=u;ed.w=0;ed.c=-c;
    31     e[v].push_back(cnt);E[cnt++]=ed;
    32 }
    33 bool spfa(){
    34     queue<int>Q;
    35     clr(p,0);p[s]=1;
    36     Q.push(s);
    37     rep(i,1,n<<1|1) d[i]=inf;
    38     d[s]=0;
    39     a[s]=inf;
    40     while(!Q.empty()){
    41         int x=Q.front();Q.pop();p[x]=0;
    42         Rep(i,0,x){
    43             edge ed=E[e[x][i]];
    44             if(ed.w&&d[ed.v]>d[x]+ed.c){
    45                 d[ed.v]=d[x]+ed.c;
    46                 a[ed.v]=min(a[x],ed.w);
    47                 b[ed.v]=e[x][i];
    48                 if(!p[ed.v]){
    49                     Q.push(ed.v);
    50                     p[ed.v]=1;
    51                 }
    52             }
    53         }
    54     }
    55     return d[t]!=inf;
    56 }
    57 Ans costflow(){
    58     Ans ans;
    59     ans.flow=ans.cost=0;
    60     while(spfa()){
    61         ans.flow+=a[t];
    62         ans.cost+=a[t]*d[t];
    63         for(int i=t;i!=s;i=E[b[i]^1].v){
    64             E[b[i]].w-=a[t];
    65             E[b[i]^1].w+=a[t];
    66         }
    67     }
    68     return ans;
    69 }
    70 int main(){
    71     scanf("%d%d",&n,&m);
    72     s=1;t=n;
    73     rep(i,2,n<<1|1) if(i!=t) addedge(i,i+n,1,0);
    74     rep(i,0,m){
    75         int u,v,c;
    76         scanf("%d%d%d",&u,&v,&c);
    77         addedge(u==1?u:u+n,v,1,c);
    78     }
    79     Ans ans=costflow();
    80     printf("%d %d
    ",ans.flow,ans.cost);
    81     return 0;
    82 }
    View Code

    1877: [SDOI2009]晨跑

    Time Limit: 4 Sec  Memory Limit: 64 MB
    Submit: 1446  Solved: 756
    [Submit][Status][Discuss]

    Description

    Elaxia最近迷恋上了空手道,他为自己设定了一套健身计划,比如俯卧撑、仰卧起坐等 等,不过到目前为止,他坚持下来的只有晨跑。 现在给出一张学校附近的地图,这张地图中包含N个十字路口和M条街道,Elaxia只能从 一个十字路口跑向另外一个十字路口,街道之间只在十字路口处相交。Elaxia每天从寝室出发 跑到学校,保证寝室编号为1,学校编号为N。 Elaxia的晨跑计划是按周期(包含若干天)进行的,由于他不喜欢走重复的路线,所以 在一个周期内,每天的晨跑路线都不会相交(在十字路口处),寝室和学校不算十字路 口。Elaxia耐力不太好,他希望在一个周期内跑的路程尽量短,但是又希望训练周期包含的天 数尽量长。 除了练空手道,Elaxia其他时间都花在了学习和找MM上面,所有他想请你帮忙为他设计 一套满足他要求的晨跑计划。

    Input

    第一行:两个数N,M。表示十字路口数和街道数。 接下来M行,每行3个数a,b,c,表示路口a和路口b之间有条长度为c的街道(单向)。

    Output

    两个数,第一个数为最长周期的天数,第二个数为满足最长天数的条件下最短的路程长 度。

    Sample Input

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

    Sample Output

    2 11

    HINT

    对于30%的数据,N ≤ 20,M ≤ 120。
    对于100%的数据,N ≤ 200,M ≤ 20000。

    Source

    [Submit][Status][Discuss]
  • 相关阅读:
    怎么对Navicat for Oracle 调试
    老版本的java代码与新代码如何找出差异
    Oracle 外部表是做什么用的
    如何在Navicat 中编辑和记录
    如何使用文件对比工具文件夹比较会话菜单
    哪些工具可以用来进行Bug管理
    5类开发者须知的工具
    怎么找出代码之间的差异
    Beyond Compare不仅可以修改网页代码
    文件对比工具有哪些用途
  • 原文地址:https://www.cnblogs.com/chensiang/p/4771375.html
Copyright © 2011-2022 走看看