您的位置:首页 > 其它

【BZOJ 1877】 [SDOI2009]晨跑

2016-02-02 11:08 435 查看
带着 freopen提交会TLE.......

1 #include <cstdio>
2 #include <iostream>
3 #include <string>
4 #include <algorithm>
5 using namespace std;
6 #define N 1000000
7 #define INF 1000000000
8 int n,m,s,t;
9 int tot=1,g
,nnext
,cost
,flow
,num
;
void Add(int x,int y,int z,int f)
{
// cout<<x<<' '<<y<<' '<<z<<' '<<f<<endl;
tot++;
nnext[tot]=g[x];
g[x]=tot;
num[tot]=y;
cost[tot]=z;
flow[tot]=f;
}

int fa
,fx
,d[500],team
,head,tail;
bool b
;
bool SPFA()
{
// cout<<endl;
for(int i=1;i<=n*2;i++) d[i]=INF;
d[s]=0;
head=tail=0;
team[++tail]=s; b[s]=true;
while(head<tail)
{
int x=team[++head];b[x]=false; //cout<<x<<' ';
for(int i=g[x];i;i=nnext[i])
if(d[num[i]]>d[x]+cost[i]&&flow[i]!=0)
{
d[num[i]]=d[x]+cost[i]; //cout<<num[i]<<' ';
fa[num[i]]=x;
fx[num[i]]=i;
if(!b[num[i]])
{
b[num[i]]=true;
team[++tail]=num[i];
}
}//cout<<endl;
}
if(d[t]==INF) return false;
return true;
}
int main()
{
// freopen("a.in","r",stdin);

scanf("%d %d",&n,&m);s=1+n,t=n;
for(int i=1;i<=m;i++)
{
int x,y,z;
scanf("%d %d %d",&x,&y,&z);
Add(x+n,y,z,1);
Add(y,x+n,-z,0);
}
for(int i=1;i<=n;i++)
{
Add(i,i+n,0,1);
Add(i+n,i,0,0);
}
int max_flow=0,min_cost=0;
while(SPFA())
{
max_flow++;
for(int i=t;i!=s;i=fa[i])
{
// cout<<i<<' '<<cost[fx[i]]<<endl;
int tmp=fx[i];
min_cost+=cost[tmp];
flow[tmp]--;
flow[tmp^1]++;
}//cout<<min_cost<<endl;cout<<endl;
}
printf("%d %d\n",max_flow,min_cost);
return 0;81 }
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: