| ||||||||||
| Online Judge | Problem Set | Authors | Online Contests | User | ||||||
|---|---|---|---|---|---|---|---|---|---|---|
| Web Board Home Page F.A.Qs Statistical Charts | Current Contest Past Contests Scheduled Contests Award Contest | |||||||||
最大流套模板的TLE的注意这个题的增广路完全可以不用spfa,因为边的权值只有0和1
改之前TLE,改完之后438MS,TLE的都来试试吧
另外这题双向边 重边按照两条处理 别被坑了
#include<stdio.h>
#include<string.h>
#include<stdlib.h>
#define c(a) memset(a,0,sizeof a);
#define min(a,b) (a<b?a:b)
#define max(a,b) (a>b?a:b)
#define M 210
struct abcd{int from,to,f;}edges[40100];
int m,n,T,s,t,ans,top;
int table[M][M];
void initialize(){c(table);ans=0;}
int f[M],from[M],q[65540];
unsigned short r,h;
bool maxflow()
{
int i;c(f);
f[s]=1;q[++h]=s;
while(r!=h)
{
r++;
for(i=1;i<=n;i++)if(!f[i])if(table[q[r]][i])f[i]=1,from[i]=q[r],q[++h]=i;
}
if(!f[t])return false;
ans++;
for(i=n;i^1;i=from[i])table[from[i]][i]--,table[i][from[i]]++;
return true;
}
bool Judge(int x)
{
initialize();
for(int i=1;i<=m;i++)if(edges[i].f<=x)table[edges[i].from][edges[i].to]++,table[edges[i].to][edges[i].from]++;
while(maxflow());
if(ans>=T)return 1;
return 0;
}
int divide(int x,int y)
{
int mid=x+y>>1;
if(x+1>=y){if(Judge(x))return x;return y;}
if(Judge(mid))return divide(x,mid);
else return divide(mid,y);
}
int main()
{
int i,x,y,z;
scanf("%d%d%d",&n,&m,&T);s=1;t=n;
for(i=1;i<=m;i++)scanf("%d%d%d",&edges[i].from,&edges[i].to,&edges[i].f),top=max(top,edges[i].f);
printf("%d",divide(1,top));
}
Followed by:
Post your reply here: |
All Rights Reserved 2003-2013 Ying Fuchen,Xu Pengcheng,Xie Di
Any problem, Please Contact Administrator