传送门:https://www.luogu.org/problem/P3381
反正就是求最大流+最短路但是弱得一批的我还是不会用Dijkstra做于是放的是最好看最简单的SPFA的代码
相信蒟蒻最懂你的需要
1 #include<bits/stdc++.h>
2 using namespace std;
3 int n,m;
4 struct edge{
5 int to,nxt,flow,dis;
6 }e[100010];int tot=-1;
7 int first[100010];
8 int dis[100010],flow[100010];
9 bool vis[100010];
10 int pre[100010],last[100010];
11 int s,t;
12 int maxflow,mincost;
13 inline void add_edge(int a,int b,int c,int d)
14 {
15 e[++tot].to=b;
16 e[tot].flow=c;
17 e[tot].nxt=first[a];
18 e[tot].dis=d;
19 first[a]=tot;
20 }
21 inline int kd()
22 {
23 int x=0,f=1;char ch=getchar();
24 while(ch<'0'||ch>'9'){if(ch=='-')f=-1;ch=getchar();}
25 while(ch>='0'&&ch<='9'){x=x*10+(ch^48);ch=getchar();}
26 return x*f;
27 }
28 bool spfa()
29 {
30 memset(dis,0x3f3f3f3f,sizeof(dis));
31 memset(vis,false,sizeof(vis));
32 memset(flow,0x3f3f3f3f,sizeof(flow));
33 queue<int>q;
34 q.push(s);
35 vis[s]=true;
36 dis[s]=0;
37 pre[t]=-1;
38 while(q.empty()==false)
39 {
40 int now=q.front();
41 q.pop();
42 vis[now]=false;
43 for(register int i=first[now];i!=-1;i=e[i].nxt)
44 {
45 if(e[i].flow!=0&&dis[e[i].to]>dis[now]+e[i].dis)
46 {
47 dis[e[i].to]=dis[now]+e[i].dis;
48 pre[e[i].to]=now;
49 last[e[i].to]=i;
50 flow[e[i].to]=min(flow[now],e[i].flow);
51 if(vis[e[i].to]==false)
52 {
53 vis[e[i].to]=true;
54 q.push(e[i].to);
55 }
56 }
57 }
58 }
59 if(pre[t]==-1)return false;
60 return true;
61 }
62 void mcmf()
63 {
64 while(spfa())
65 {
66 int now=t;
67 maxflow+=flow[t];
68 mincost+=dis[t]*flow[t];
69 while(now!=s)
70 {
71 e[last[now]].flow-=flow[t];
72 e[last[now]^1].flow+=flow[t];
73 now=pre[now];
74
75 }
76 }
77 }
78 int main()
79 {
80 memset(first,-1,sizeof(first));
81 n=kd(),m=kd(),s=kd(),t=kd();
82 for(register int i=1;i<=m;i++)
83 {
84 int a=kd(),b=kd(),c=kd(),d=kd();
85 add_edge(a,b,c,d);
86 add_edge(b,a,0,-d);
87 }
88 mcmf();
89 cout<<maxflow<<" "<<mincost<<endl;
90 return 0;
91 }