额这题卡了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 }