| ||||||||||
| 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 | |||||||||
请问高手哪里错了?#include<stdio.h>
#include<iostream>
#include<queue>
#include<climits>
using namespace std;
const int MAXV=210;
const int MAXDEGREE=40005;
const int INF=INT_MAX ;
int dis[MAXV];
typedef struct
{
int v; //顶点编号
int capacity; //容量
int flow; //流量
int residual; //剩余容量
}edge;
typedef struct
{
edge edge[MAXV+1][MAXV+1];
int degree[MAXV+1];
int nvertices;/// 顶点数
int nedges; //边数目
}graph;
void init(graph *g)
{
int i;
for(i=0;i<=g->nvertices;i++)
{
g->degree[i]=0; // 所有的度数初始化为0
}
return ;
}
edge *findedge(graph *g,int s,int e) //判断是否有重边
{
int i;///edge *tep;
for(i=0;i<g->degree[s];i++)
if(g->edge[s][i].v==e)
return &g->edge[s][i];
return NULL;
}
void insertArc(graph *g,int s,int e,int w)
{
int k;
edge *tem;
tem=findedge(g,s,e);
k=g->degree[s];
if(tem==NULL) //判断是否有重边 无重边
{
g->edge[s][k].v=e;
g->edge[s][k].capacity=w;
g->edge[s][k].flow=0;///
g->edge[s][k].residual=w;
g->degree[s]++;
}
else
{ //有重边
tem->capacity+=w;
tem->residual+=w;
}
return ;
}
int Min(int m,int n) //找出最小增流量
{
if(m>n)return n;
else
return m;
}
int bfs(graph *g,int s,int e) //广度收索 分层
{
if(s==e)return 0;
int k,i,tmp;
for(i=0;i<=g->nvertices;i++)
dis[i]=-1;
dis[s]=0;
queue<int>q;
q.push(s);
while(!q.empty())
{
k=q.front();
q.pop();
for(i=0;i<g->degree[k];i++)
{
tmp=g->edge[k][i].v;
if(dis[tmp]==-1 && g->edge[k][i].residual!=0)
{
dis[tmp]=dis[k]+1;
if(tmp==e)
return 1;
q.push(tmp);
}
}
}
return 0;
}
int dfs(graph *g,int s,int e,int limit) ///深度 求出最小增加的流量
{
int volume=0,k,i;
if(s==e)return limit;
edge *tmp;
for(i=0;i<g->degree[s];i++)
{
tmp=&g->edge[s][i];
if(tmp->residual!=0 && dis[tmp->v]==dis[s]+1)
{
k=dfs(g,tmp->v,e,Min(tmp->residual,limit-volume));
if(k>0)
{
tmp->flow+=k;
tmp->residual-=k;
// tmp=findedge(g,tmp->v,s);
// tmp->residual+=k;
volume+=k;
if(volume==limit)break;
}
else
dis[tmp->v]=-1;
}
}
return volume;
}
int Dinic(graph *g,int s,int e) //
{
int maxFlow=0;
while(bfs(g,s,e))
{
maxFlow+=dfs(g,s,e,INF);
}
return maxFlow;
}
int main()
{
graph *g;
int m,n,a[1000],flag[1001],x,y,i,t,w,maxFlow,b[1000];
while(scanf("%d%d",&m,&n)!=EOF){
int s=1;
memset(flag,0,sizeof(flag));
memset(b,0,sizeof(b));
g=(graph *)malloc(sizeof(graph));
g->nvertices=n+3;
init(g);
t=n+2;
for(i=1;i<=m;i++)
scanf("%d",&a[i]);
for(int k=1;k<=n;k++)
{
//insertArc(g,s,k+1,a[i]);
scanf("%d",&x);
for(i=1;i<=x;i++)
{
scanf("%d",&y);
b[k]=b[k]+a[y];
a[y]=0;
if(flag[y]!=0)
{
insertArc(g,flag[y]+1,k+1,1005);
}
else
flag[y]=k;
}
if(b[k]!=0)
insertArc(g,s,k+1,b[k]);
scanf("%d",&w);
insertArc(g,k+1,t,w);
}
maxFlow=Dinic(g,s,t);
cout<<maxFlow<<endl;
free(g);
}
return 0;
}
Followed by: Post your reply here: |
All Rights Reserved 2003-2013 Ying Fuchen,Xu Pengcheng,Xie Di
Any problem, Please Contact Administrator