bzoj 1877: [SDOI2009]晨跑

 1 #include<cstdio>
 2 #include<iostream>
 3 #include<cstring>
 4 #define M 6009
 5 #define inf 2139062143
 6 using namespace std;
 7 int head[M],next[10*M],u[10*M],v[10*M],w[10*M],fro[10*M],n,m,cnt=1,d[M],f[M],q[M],fr[M],ans,ans1;
 8 void jia(int a1,int a2,int a3,int a4)
 9 {
10     cnt++;
11     fro[cnt]=a1;
12     u[cnt]=a2;
13     v[cnt]=a3;
14     w[cnt]=a4;
15     next[cnt]=head[a1];
16     head[a1]=cnt;
17     return;
18 }
19 bool spfa()
20 {
21     memset(d,127,sizeof(int)*(3*n));
22     d[1]=0;
23     f[1]=1;
24     q[1]=1;
25     int h=0,t=1;
26     for(;h<t;)
27       {
28         h++;
29         int p=q[h];
30         f[p]=0;
31         for(int i=head[p];i;i=next[i])
32           if(v[i]&&d[u[i]]>d[p]+w[i])
33             {
34                 d[u[i]]=d[p]+w[i];
35                 fr[u[i]]=i;
36                 if(!f[u[i]])
37                   {
38                     f[u[i]]=1;
39                     t++;
40                     q[t]=u[i];
41                     }
42             }
43       }
44     if(d[n]!=inf)
45       return 1;
46     return 0;
47 }
48 void mcf()
49 {
50     int mx=inf;
51     for(int i=fr[n];i;i=fr[fro[i]])
52       mx=min(mx,v[i]);
53     ans1+=mx;
54     for(int i=fr[n];i;i=fr[fro[i]])
55       {
56         v[i]-=mx;
57         v[i^1]+=mx;
58         ans+=mx*(w[i]);
59       }
60 }
61 int main()
62 {
63     scanf("%d%d",&n,&m);
64     for(int i=1;i<=m;i++)
65       {
66         int a1,a2,a3;
67         scanf("%d%d%d",&a1,&a2,&a3);
68         if(a1!=1&&a1!=n)
69           a1+=n;
70         jia(a1,a2,1,a3);
71         jia(a2,a1,0,-a3);
72       }
73     for(int i=2;i<n;i++)
74       {
75         jia(i,i+n,1,0);
76         jia(i+n,i,0,0);
77       }
78     for(;spfa();)
79       mcf();
80     printf("%d %d
",ans1,ans);
81     return 0;
82 }
 1 #include<cstdio>
 2 #include<iostream>
 3 #include<cstring>
 4 #define M 6009
 5 #define inf 2139062143
 6 using namespace std;
 7 int head[M],next[10*M],u[10*M],v[10*M],w[10*M],fro[10*M],n,m,cnt=1,d[M],f[M],q[M],fr[M],ans,ans1;
 8 void jia(int a1,int a2,int a3,int a4)
 9 {
10     cnt++;
11     fro[cnt]=a1;
12     u[cnt]=a2;
13     v[cnt]=a3;
14     w[cnt]=a4;
15     next[cnt]=head[a1];
16     head[a1]=cnt;
17     return;
18 }
19 bool spfa()
20 {
21     memset(d,127,sizeof(int)*(3*n));
22     d[1]=0;
23     f[1]=1;
24     q[1]=1;
25     int h=0,t=1;
26     for(;h<t;)
27       {
28         h++;
29         int p=q[h];
30         f[p]=0;
31         for(int i=head[p];i;i=next[i])
32           if(v[i]&&d[u[i]]>d[p]+w[i])
33             {
34                 d[u[i]]=d[p]+w[i];
35                 fr[u[i]]=i;
36                 if(!f[u[i]])
37                   {
38                     f[u[i]]=1;
39                     t++;
40                     q[t]=u[i];
41                     }
42             }
43       }
44     if(d[n]!=inf)
45       return 1;
46     return 0;
47 }
48 void mcf()
49 {
50     int mx=inf;
51     for(int i=fr[n];i;i=fr[fro[i]])
52       mx=min(mx,v[i]);
53     ans1+=mx;
54     for(int i=fr[n];i;i=fr[fro[i]])
55       {
56         v[i]-=mx;
57         v[i^1]+=mx;
58         ans+=mx*(w[i]);
59       }
60 }
61 int main()
62 {
63     scanf("%d%d",&n,&m);
64     for(int i=1;i<=m;i++)
65       {
66         int a1,a2,a3;
67         scanf("%d%d%d",&a1,&a2,&a3);
68         if(a1!=1&&a1!=n)
69           a1+=n;
70         jia(a1,a2,1,a3);
71         jia(a2,a1,0,-a3);
72       }
73     for(int i=2;i<n;i++)
74       {
75         jia(i,i+n,1,0);
76         jia(i+n,i,0,0);
77       }
78     for(;spfa();)
79       mcf();
80     printf("%d %d
",ans1,ans);
81     return 0;
82 }

不能相交,拆点费用流。

原文地址:https://www.cnblogs.com/xydddd/p/5281990.html