Help to find my bugs!!!
阿新 • • 發佈:2018-12-21
#include<iostream>
#include<cstdio>
#include<cstring>
#include<queue>
using namespace std;
const int inf = 987654321;
struct edge
{
int flow;
int cost;
int to;
}E[200005];
queue <int> Q;
int cnt[200005];
int vis[200005];
int per[200005];
int dis[200005];
int fir[200005];
int nxt[200005 ];
int n, m, e;
int maxFlow,minCost;
bool SPFA(int s,int t)
{
for(int i = 1; i <= n; i++)
{
dis[i] = inf;
vis[i] = 0;
per[i] = -1;
cnt[i] = 0;
}
dis[s] = 0;
vis[s] = 1;
cnt[s]++;
while(!Q.empty())
{
Q.pop();
}
Q.push(s);
while (!Q.empty())
{
int p = Q.front();
Q.pop();
vis[p] = 0;
for(int i = fir[p]; i != -1; i = nxt[i])
{
if(E[i].flow > 0 && dis[E[i].to] > dis[p] + E[i].cost)
{
dis[E[i].to] = dis[p] + E[i].cost;
per[E[i] .to] = i;
if(!vis[E[i].to])
{
Q.push(E[i].to);
vis[E[i].to] = 1;
if(++cnt[E[i].to] > n)
return false;
}
}
}
}
if(dis[t] == inf)
return false;
else return true;
}
void addedge(int a,int b,int c,int d)
{
e++;
E[e].flow = c;
E[e].cost = d;
E[e].to = b;
nxt[e] = fir[a];
fir[a] = e;
e++;
E[e].flow = 0;
E[e].cost = -c;
E[e].to = a;
nxt[e] = fir[b];
fir[b] = e;
}
void input()
{
memset(fir,-1,sizeof(fir));
memset(nxt,-1,sizeof(nxt));
scanf("%d %d", &n, &m);
int a,b,c,d;
for(int i = 0; i < m; i++)
{
scanf("%d %d %d %d", &a, &b, &c, &d);
addedge(a,b,c,d);
}
}
int solve()
{
while(SPFA(1,n))
{
int thisflow = inf;
int thiscost = 0;
for(int i = per[n]; i != -1; i = per[E[i^1].to])
{
thisflow = min(thisflow,E[i].flow);
thiscost += E[i].cost;
}
cout<<endl;
for(int i = per[n]; i != -1; i = per[E[i^1].to])
{
E[i].flow += thisflow;
E[i^1].flow -= thisflow;
}
maxFlow += thisflow;
minCost += thiscost * thisflow;
}
}
int main()
{
input();
solve();
printf("%d %d",minCost, maxFlow);
return 0;
}