#include<vector>
#include<cstdio>
#include<algorithm>
#define min(x,y) (((x)>(y))?(y):(x))
#define INF 0x3f3f3f3f
#define MAX_V 64+16
using namespace std;
struct edge
{
int to,cap,cost,rev;
edge(){}
edge(int to1,int cap1,int cost1,int rev1)
{
to=to1;
cap=cap1;
cost=cost1;
rev=rev1;
}
};
int V;
vector<edge>G[MAX_V];
int dist[MAX_V];
int prevv[MAX_V],preve[MAX_V];
void add_edge(int from,int to,int cap,int cost)
{
G[from].push_back(edge(to,cap,cost,G[to].size()));
G[to].push_back(edge(from,0,-cost,G[from].size()-1));
}
int min_cost_flow(int s,int t,int f)
{
int res=0,v;
while(f>0)
{
fill(dist,dist+V,INF);
dist[s]=0;
bool update=true;
while(update)
{
update=false;
for(v=0;v<V;v++)
{
if(dist[v]==INF)
continue;
for(int i=0;i<G[v].size();i++)
{
edge &e=G[v][i];
if(e.cap>0&&dist[e.to]>dist[v]+e.cost)
{
dist[e.to]=dist[v]+e.cost;
prevv[e.to]=v;
preve[e.to]=i;
update=true;
}
}
}
}
if(dist[t]==INF)
return -1;
int d=f;
for(int v=t;v!=s;v=prevv[v])
d=min(d,G[prevv[v]][preve[v]].cap);
f-=d;
res+=d*dist[t];
for(v=t;v!=s;v=prevv[v])
{
edge &e=G[prevv[v]][preve[v]];
e.cap-=d;
G[v][e.rev].cap+=d;
}
}
return res;
}
int main()
{
int i,n,m,id=0;
while(~scanf("%d%d",&n,&m))
{
V=n+2;
if(n==0&&m==0)
break;
add_edge(0,1,2,0);
add_edge(n,n+1,2,0);
while(m--)
{
int a,b,c;
scanf("%d%d%d",&a,&b,&c);
add_edge(a+1,b+1,1,c);
}
int ans=min_cost_flow(0,n+1,2);
printf("Instance #%d: ",++id);
if(ans==-1)
printf("Not possible\n");
else
printf("%d\n",ans);
for(i=0;i<=n+1;i++)
G[i].clear();
}
return 0;
}
poj 3068 最小费用流
最新推荐文章于 2021-10-29 22:08:24 发布