第一个测试点AC,其他全部TLE
#include<bits/stdc++.h>
#define int long long
using namespace std;
int n,m;
int head[1000005],nxt[1000005],to[1000005],flow[1000005],val[1000005],cnt=1;
int maxflow,mincost,s=0,t;
void add(int x,int y,int f,int w)
{
to[++cnt]=y;
flow[cnt]=f;
val[cnt]=w;
nxt[cnt]=head[x];
head[x]=cnt;
}
int dis[50005],f[50005];
bool bfs()
{
queue<int> q;
q.push(s);
memset(dis,0x3f,sizeof(dis));
dis[s]=0;
while(!q.empty())
{
int tmp=q.front();
q.pop();
f[tmp]=0;
for(int i=head[tmp];i;i=nxt[i])
{
if(flow[i]&&dis[to[i]]>dis[tmp]+val[i])
{
dis[to[i]]=dis[tmp]+val[i];
if(!f[to[i]])
{
q.push(to[i]);
f[to[i]]=1;
}
}
}
}
return dis[t]!=0x3f3f3f3f3f3f3f3f;
}
int dfs(int now,int flow1)
{
if(now==t)
{
maxflow+=flow1;
return flow1;
}
f[now]=true;
int use=0;
for(int i=head[now];i;i=nxt[i])
{
if(!f[to[i]]&&flow[i]&&dis[now]+val[i]==dis[to[i]])
{
int f=dfs(to[i],min(flow[i],flow1-use));
flow[i]-=f,flow[i^1]+=f,mincost+=f*val[i],use+=f;
}
}
f[now]=false;
return use;
}
void dinic()
{
maxflow=mincost=0;
while(bfs())
dfs(s,0x3f3f3f3f3f3f3f3f);
}
int k;
int x[300005],y[300005],f1[300005],w[300005];
signed main()
{
cin >>n>>m>>k;
s=1,t=n;
for(int i=1;i<=m;i++)
cin >>x[i]>>y[i]>>f1[i]>>w[i],add(x[i],y[i],f1[i],0),add(y[i],x[i],0,0);
dinic();
s=0;
cout <<maxflow<<" ";
add(s,1,k,0),add(1,s,0,0);
for(int i=1;i<=m;i++)
add(x[i],y[i],0x3f3f3f3f,w[i]),add(y[i],x[i],0,-w[i]);
dinic();
cout <<mincost<<endl;
return 0;
}