poj 2455 Secret Milking Machine

二分+最大流解决路径问题
本文讨论了如何使用二分法结合最大流算法解决寻找最远两点间路径长度的问题,通过重建网络并求解最大流来确定满足条件的最大路径长度。文中详细解释了实现过程,包括注意点及避免常见错误的方法。

题意:有N个点,之间有P条路(双向),要求每次从1到N走不同的路T次,求这T次中两点间路最长的一条

思路:二分+最大流,如果两点之间有路,就建立流量为1的网络,然后二分路径长度,从新建立符合要求的图,求最大流

注意重边的情况,如果是邻接表没事,否则注意,边不是取最小,要都存下,因为有可能都符合要求,WA了很多次都是错在这了

三个小时就这么没了……今天一早,看出了原因了,于是用vector解决了,明显很慢啊,不知道是不是模板的原因……

核心code:

vector<int>  map[nMax][nMax];  //原始图

void rebuild(int mid)
{
memset(G, 0, sizeof(G));
memset(F, 0, sizeof(F));  //
for(int i=1; i<=n; i++)
for(int j=1; j<=n; j++)
{
int tt=map[i][j].size();
for(int t=0; t<tt; t++)
if(map[i][j][t]<=mid)
G[i][j]+=1;  //重建的网络
}
}

int main()
{
scanf("%d%d%d", &n, &m, &t);
source=1;  //源点
sink=n;    //汇点
int x, y, dist;
for(int i=1; i<=m; i++)
{
scanf("%d%d%d", &x, &y, &dist);
map[x][y].push_back(dist);
map[y][x].push_back(dist);
Max=max(Max, dist);
Min=min(Min, dist);
}
int mid,flow;
while(Max > Min)
{
mid=(Max+Min)/2;
rebuild(mid);
//cout<<ans<<" ";
flow=find_max_flow();
if(flow>=t)
Max=mid;
else
Min=mid+1;
}
printf("%d\n", Max);
return 0;
}

 

转载于:https://www.cnblogs.com/FreeAquar/archive/2011/08/18/2144149.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值