| ||||||||||
| 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:求大牛指点接下来怎么做! 用dinic模板写的最大流!然后不知道怎么判别输入输出边!In Reply To:求大牛指点接下来怎么做! 用dinic模板写的最大流!然后不知道怎么判别输入输出边! Posted by:X2nes at 2011-08-13 19:59:37 > 建图的时候已经把输入 和输出边的点分开了 就是不知道怎么继续了!!求教啊!
> #include <iostream>
> using namespace std;
> const int maxn=60500;
> const int inf=1<<30;
> struct edge
> {
> int from,to,val,next;
> }map[maxn];
> int vis[500],que[500],dist[500],len;
> int wIn[500],wOut[500];
> int mark[500];
> int S,T;
> int M,N;
> int edg[5001][2];
> void init()
> {
> len=0;
> memset(vis,-1,sizeof(vis));
> }
> void insert (int from,int to,int val) //从from 到 to
> {
> map[len].from=from;
> map[len].to=to;
> map[len].val=val;
> map[len].next=vis[from];
> vis[from]=len++;
> map[len].from=to;
> map[len].to=from;
> map[len].val=0;
> map[len].next=vis[to];
> vis[to]=len++;
> }
> int Dinic(int n,int s,int t)
> {
> int ans=0;
> while(true)
> {
> int head,tail,id,i;
> head=tail=0;
> que[tail++]=s;
> memset(dist,-1,sizeof(dist));
> dist[s]=0;
> while(head<tail)
> {
> id=vis[que[head++]];
> while(id!=-1)
> {
> if(map[id].val>0&&dist[map[id].to]==-1)
> {
> dist[map[id].to]=dist[map[id].from]+1;
> que[tail++]=map[id].to;
> if(map[id].to==t)
> {
> head=tail;
> break;
> }
> }
> id=map[id].next;
> }
> }
> if(dist[t]==-1)
> break;
> id=s,tail=0;
> while(true)
> {
> if(id==t) //找到一条增广路
> {
> int flow=inf,fir;
> for(i=0;i<tail;i++)
> if(map[que[i]].val<flow)
> {
> fir=i;
> flow=map[que[i]].val;
> }
> for(i=0;i<tail;i++)
> map[que[i]].val-=flow,map[que[i]^1].val+=flow;
> ans+=flow;
> tail=fir;
> id=map[que[fir]].from;
> }
> id=vis[id];
> while(id!=-1)
> {
> if(map[id].val>0&&dist[map[id].from]+1==dist[map[id].to])
> break;
> id=map[id].next;
> }
> if(id!=-1)
> {
> que[tail++]=id;
> id=map[id].to;
> }
> else
> {
> if(tail==0)
> break;
> dist[map[que[tail-1]].to]=-1;
> id=map[que[--tail]].from;
> }
> }
> }
> return ans;
> }
> void CreatGraph()
> {// 建图
> int i, ii;
> S = 0;
> T = 2 * N + 1;
> len = 0;
> for (i = 1; i <= N; i++)
> {
> ii = i + N;
> insert(S, ii, wOut[i]);
> insert(i, T, wIn[i]);
> }
> for (i = 1; i <= M; i++)
> {
> ii = edg[i][0] + N;
> insert(ii, edg[i][1], 0xffffff);
> }
> }
> int main()
> {
> init();
> int i, num;
> int cnt[500];
> scanf("%d%d", &N, &M);
> for (i = 1; i <= N; i++)
> scanf("%d", &wIn[i]);
> for (i = 1; i <= N; i++)
> scanf("%d", &wOut[i]);
> for (i = 1; i <= M; i++)
> scanf("%d%d", &edg[i][0], &edg[i][1]);
> CreatGraph();
> int ans=Dinic(T,S,T);
> cout<<ans<<endl;
> return 0;
> }
dfs()找割点
Followed by: Post your reply here: |
All Rights Reserved 2003-2013 Ying Fuchen,Xu Pengcheng,Xie Di
Any problem, Please Contact Administrator