POJ 2455 网络流英文阅读题

来源:互联网 发布:mac新版itunes添加铃声 编辑:程序博客网 时间:2024/06/06 09:37

老戴找...

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

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

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

#include<iostream>#include<string>#include<cstdio>#include<algorithm>#define MN 222#define INF 1111111using 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 );  }}