比赛 |
20120708 |
评测结果 |
WAWWWTTATT |
题目名称 |
最小最大生成树 |
最终得分 |
20 |
用户昵称 |
Citron酱 |
运行时间 |
4.089 s |
代码语言 |
C++ |
内存使用 |
6.62 MiB |
提交时间 |
2012-07-08 09:19:58 |
显示代码纯文本
#include <cstdio>
#include <climits>
#define I_F "mstmn.in"
#define O_F "mstmn.out"
const long MAXm=200000*2+1;
const int MAXn=20000;
struct edge
{
int x;
short c;
edge *op, *next;
};
edge pool[MAXm];
edge *ph=pool;
edge *map[MAXn]={NULL};
int n, s, t;
int h[MAXn]={0}, v[MAXn]={0};
bool flag=true;
long ans;
void Input();
long Dfs(const int&, const long&);
void Sap();
void Output();
int main()
{
Input();
Sap();
Output();
return 0;
}
void Input()
{
long m;
int a, b;
edge *temp;
freopen(I_F,"r",stdin);
for (scanf("%d%ld",&n,&m); m>0; --m)
{
scanf("%d%d%*d",&a,&b);
--a, --b;
temp=map[a];
map[a]=ph++;
map[a]->x=b;
map[a]->c=1;
map[a]->next=temp;
temp=map[b];
map[b]=ph++;
map[b]->x=a;
map[b]->c=1;
map[b]->next=temp;
map[a]->op=map[b];
map[b]->op=map[a];
}
scanf("%d%d%*d",&s,&t);
--s, --t;
}
long Dfs(const int &x, const long &s)
{
if (x==t)
return s;
long f=s, now;
for (edge *i=map[x]; i!=NULL && flag && f>0; i=i->next)
if (i->c>0 && h[i->x]==h[x]-1)
{
now=Dfs(i->x,(f<i->c)?f:i->c);
f-=now;
i->c-=now;
i->op->c+=now;
}
if (--v[h[x]++]==0)
flag=false;
return s-f;
}
void Sap()
{
v[0]=n;
while (h[s]<n && flag)
ans+=Dfs(s,LONG_MAX/2);
}
void Output()
{
freopen(O_F,"w",stdout);
printf("%ld\n",ans);
}