| ||||||||||
| 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 | |||||||||
Re:在HDU过了,在PKU却过不了,PKU有什么HDU没测的数据吗?高手指教一下!!!谢谢!In Reply To:在HDU过了,在PKU却过不了,PKU有什么HDU没测的数据吗?高手指教一下!!!谢谢! Posted by:liuzhi67 at 2010-10-01 15:01:07 > #include <iostream>
> #include <queue>
> using namespace std;
> typedef struct edgenode
> {
> long e;
> struct edgenode *next;
> }Edge;
> Edge edge[203];
> long r[203][203],f[203][203];
> long path[210];
> char flag[210];
> long m;
> long BFS(long s) //广搜增广路
> {
> Edge *te;
> queue<long> q;
> long tq1;
> memset(flag,0,sizeof(flag));
> q.push(s);
> flag[s]=1;
> while(!q.empty())
> {
> tq1=q.front(),q.pop();
> te=edge[tq1].next;
> while(te!=NULL)
> {
> if(flag[te->e]==0&&r[tq1][te->e]<f[tq1][te->e]) //结点未被访问过且还可有流通过
> {
> path[te->e]=tq1; //记录路径
> flag[te->e]=1;
> if(te->e==m)
> return 1; //找到增广路返回1
> q.push(te->e);
> }
> te=te->next;
> }
> }
> return -1; //未找到返回-1
> }
> int main()
> {
> long n,i,s,e,c,sum1,min1,temp1;
> Edge *te;
> //freopen("in.txt","r",stdin);
> while(scanf("%ld%ld",&n,&m)!=EOF)
> {
> for(i=1;i<=n;i++)
> {
> scanf("%ld%ld%ld",&s,&e,&c);
> f[s][e]+=c; //构造网络
> te=new Edge;
> te->e=e; //插入链表
> te->next=edge[s].next; //初值为NULL,注意释放空间
> edge[s].next=te;
> }
> while(1)
> {
> if(BFS(1)==-1)
> break;
> i=m;
> min1=0x7FFFFFFF;
> while(1)
> {
> temp1=f[path[i]][i]-r[path[i]][i]; //最小值
> if(min1>temp1)
> min1=temp1;
> i=path[i];
> if(i==1)
> break;
> }
> i=m;
> while(1)
> { //构造残留网络
> r[path[i]][i]+=min1;
> r[i][path[i]]=-r[path[i]][i];
> i=path[i];
> if(i==1)
> break;
> }
> }
> for(i=1,sum1=0;i<m;i++)
> sum1+=r[i][m];
> printf("%ld\n",sum1);
> memset(f,0,sizeof(f));
> memset(r,0,sizeof(r));
> memset(edge,0,sizeof(edge));
> }
> return 0;
> }
Followed by: Post your reply here: |
All Rights Reserved 2003-2013 Ying Fuchen,Xu Pengcheng,Xie Di
Any problem, Please Contact Administrator