额这题卡了dinic的时间==

不过还是强行用dinic过了,把stl语句全部换了,包括vector也改成了邻接表

还是比较慢,8000+ms,很奇怪的是,我的邻接表中加了当前弧优化竟然慢了1s===

至于sap,过两天再写吧==

 1 #pragma comment(linker,"/STACK:16777216")
 2 #include<stdio.h>
 3 #include<string.h>
 4 #define maxn 100005
 5 #define maxm 200005
 6 int minn(int x,int y)
 7 {
 8   return x<y?x:y;
 9 }
10 struct Edge{
11   int to,flow,Next;
12 };
13 struct dinic{
14   int s,t,n,now;
15   Edge edges[maxm];
16   bool vis[maxn];
17   int d[maxn],head[maxn],q[maxn];
18   void init(int _s,int _t,int _n){
19     s=_s; t=_t; n=_n;
20     memset(head,-1,sizeof(head));
21     now=0;
22   }
23   void add(int from,int to,int flow){
24     edges[now].to=to; edges[now].flow=flow;
25     edges[now].Next=head[from]; head[from]=now++;
26 
27     edges[now].to=from; edges[now].flow=flow;
28     edges[now].Next=head[to]; head[to]=now++;
29   }
30   bool bfs(){
31     memset(vis,0,sizeof(vis));
32     int front=0,rear=0;
33     q[rear++]=s;
34     d[s]=0; vis[s]=1;
35     while (front<rear){
36       int x=q[front++]; 
37       for (int i=head[x];i!=-1;i=edges[i].Next){
38         if (!vis[edges[i].to]&&edges[i].flow>0){
39           vis[edges[i].to]=1;
40           d[edges[i].to]=d[x]+1;
41           q[rear++]=edges[i].to;
42         }
43       }
44     }
45     return vis[t];
46   }
47   int dfs(int x,int a){
48     if (x==t||a==0) return a;
49     int flow=0,f;
50     for (int i=head[x];i!=-1;i=edges[i].Next){
51       if (d[x]+1==d[edges[i].to]&&edges[i].flow>0){
52         int f=dfs(edges[i].to,minn(a-flow,edges[i].flow));
53         edges[i].flow-=f;
54         edges[i^1].flow+=f;
55         flow+=f;
56         if (flow==a) return flow;
57       }
58     }
59     if (flow==0) d[x]=0; 
60     return flow;
61   }
62   int maxflow(){
63     int flow=0;
64     while (bfs())
65       flow+=dfs(s,0x3f3f3f3f);
66     return flow;
67   }
68 }g;
69 int main()
70 {
71   int T,n,m,maxx,minx,x,y,w,i,east,west;
72   scanf("%d",&T);
73   while (T--){
74     scanf("%d%d",&n,&m);
75     maxx=-0x3f3f3f3f; minx=0x3f3f3f3f;
76     for (i=1;i<=n;i++){
77       scanf("%d%d",&x,&y);
78       if (x>maxx){
79         east=i;
80         maxx=x;
81       }
82       if (x<minx){
83         west=i;
84         minx=x;
85       }
86     }
87     g.init(west,east,n);
88     for (i=1;i<=m;i++){
89       scanf("%d%d%d",&x,&y,&w);
90       g.add(x,y,w); 
91     }
92     printf("%d\n",g.maxflow());
93   }
94   return 0;
95 }
View Code

相关文章:

  • 2022-12-23
  • 2021-10-12
  • 2021-08-21
  • 2021-05-23
  • 2022-12-23
  • 2022-01-08
  • 2022-12-23
  • 2022-02-20
猜你喜欢
  • 2021-09-07
  • 2022-12-23
  • 2021-07-19
  • 2022-12-23
  • 2022-12-23
  • 2022-12-23
相关资源
相似解决方案