职务地址:hdu3488
这题跟上题基本差点儿相同啊。。。
。
详情请戳这里。
另外我认为有要改变下代码风格了。。最终知道了为什么大牛们的代码的变量名都命名的那么长。。我决定还是把源点与汇点改成source和sink吧。。用s和t太easy冲突了。。
。于是如此简单的一道题调试到了如今。
。sad。。
。
代码例如以下:
#include <iostream>
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <math.h>
#include <ctype.h>
#include <queue>
#include <map>
#include <algorithm>
using namespace std;
const int INF=0x3f3f3f3f;
int head[500], source, sink, cnt, flow, cost;
int d[500], pre[500], q[1000000], cur[500], vis[500];
struct node
{
int u, v, cap, cost, next;
}edge[1000000];
void add(int u, int v, int cap, int cost)
{
edge[cnt].v=v;
edge[cnt].cap=cap;
edge[cnt].cost=cost;
edge[cnt].next=head[u];
head[u]=cnt++;
edge[cnt].v=u;
edge[cnt].cap=0;
edge[cnt].cost=-cost;
edge[cnt].next=head[v];
head[v]=cnt++;
}
int spfa()
{
memset(d,INF,sizeof(d));
memset(vis,0,sizeof(vis));
int minflow=INF, f1=0, f2=0, i;
q[f1++]=source;
d[source]=0;
cur[source]=-1;
while(f1>=f2)
{
int u=q[f2++];
vis[u]=0;
for(i=head[u];i!=-1;i=edge[i].next)
{
int v=edge[i].v;
if(d[v]>d[u]+edge[i].cost&&edge[i].cap)
{
d[v]=d[u]+edge[i].cost;
if(minflow>edge[i].cap)
{
minflow=edge[i].cap;
}
cur[v]=i;
if(!vis[v])
{
q[f1++]=v;
vis[v]=1;
}
}
}
}
if(d[sink]==INF) return 0;
flow+=minflow;
cost+=minflow*d[sink];
for(i=cur[sink];i!=-1;i=cur[edge[i^1].v])
{
edge[i].cap-=minflow;
edge[i^1].cap+=minflow;
}
return 1;
}
int main()
{
int T, n, m, i, j, a, b, c;
scanf("%d",&T);
while(T--)
{
scanf("%d%d",&n,&m);
memset(head,-1,sizeof(head));
cnt=0;
source=0;
sink=2*n+1;
flow=0;
cost=0;
for(i=1;i<=n;i++)
{
add(source,i,1,0);
add(i+n,sink,1,0);
}
while(m--)
{
scanf("%d%d%d",&a,&b,&c);
add(a,b+n,1,c);
}
while(spfa());
printf("%d\n",cost);
}
return 0;
}
版权声明:本文博客原创文章,博客,未经同意,不得转载。