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

两遍网络流,把比他小的边建起来,最大流就是要删的边数,最大生成树同理。

posted on 2016-03-21 23:28  xiyuedong  阅读(168)  评论(0编辑  收藏  举报