当前位置: 代码迷 >> 综合 >> POJ 2455 网络流英文阅读题
  详细解决方案

POJ 2455 网络流英文阅读题

热度:77   发布时间:2024-01-20 20:29:34.0

老戴找...

这题还是很有意思的.. 哈哈~

也想了我蛮久的... 但是这题的无向边感觉有点不对劲啊!这也能AC??我都不相信啊!!

网络流的边还是不能轻易覆盖的!

#include<iostream>
#include<string>
#include<cstdio>
#include<algorithm>
#define MN 222
#define INF 1111111
using namespace std;struct EDGE{int u,v,len;
}edge[MN*MN];int N,P,T,ans,s,t,r,l;
int map[MN][MN],pre[MN],vis[MN],a[MN],que[MN];bool cmp( EDGE a,EDGE b ){return a.len<b.len;
}void setG()
{r=INF;l=1;s=1;t=N;int i,j,k,u,v,len;for( i=0;i<P;i++ )scanf( "%d%d%d",&edge[i].u,&edge[i].v,&edge[i].len );sort( edge,edge+P,cmp );
}void initG( int len )
{memset( map,0,sizeof(map) );int i,j,k;for( i=0;edge[i].len<=len&&i<P;i++ ){map[edge[i].u][edge[i].v]++;map[edge[i].v][edge[i].u]++;}
}bool bfs()
{int i,j; memset( vis,0,sizeof(vis) );int head=0,foot=0;que[foot++]=s;vis[s]=true;a[s]=INF;while( head<foot ){int u=que[head++];for( i=1;i<=t;i++ ){if( !vis[i]&&map[u][i] ){vis[i]=true;a[i]=min( a[u],map[u][i] );que[foot++]=i;pre[i]=u;if( i==t ) return true;}}}return false;
}bool work()
{ans=0;while( bfs() ){int m=t;ans+=a[t];while( m!=s ){map[pre[m]][m]-=a[t];map[m][pre[m]]+=a[t];m=pre[m];}}if( ans>=T ) return true;else return false;
}int main()
{while( scanf("%d%d%d",&N,&P,&T)!=EOF ){setG();int mid;while( (mid=(l+r)/2)&&l<r ){initG(mid);if( work() ) r=mid;else l=mid+1;}printf( "%d\n",mid );}
}