• <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
    <noscript id="pjuwb"></noscript>
          <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
            <dd id="pjuwb"></dd>
            <abbr id="pjuwb"></abbr>

            The Fourth Dimension Space

            枯葉北風(fēng)寒,忽然年以殘,念往昔,語默心酸。二十光陰無一物,韶光賤,寐難安; 不畏形影單,道途阻且慢,哪曲折,如渡飛湍。斬浪劈波酬壯志,同把酒,共言歡! -如夢令

            求SGU 194即ZOJ 2314題AC代碼

            最近在搞網(wǎng)絡(luò)流,剛研究完幾個求最大流的基本算法,今天研究了一下有上下界的可行流問題,參考了大牛ADN.cn的圖論總結(jié),算法倒不是很難,代碼也很快就寫好了,只是不知道原因,就是不能AC,郁悶我一晚上。。。在SGU上 只能過9組數(shù)據(jù),也不知道被什么BT的數(shù)據(jù)給卡住了,希望大牛們能給我點指點。 我用的方法是添加兩個附加源匯,用dinic算法求最大流,如果源匯上的邊滿流,則說明有可行流,輸出每條邊的流量,否則輸出NO.

            下面是我WA掉的代碼:
            #include<iostream>
            #include
            <cmath>
            #include
            <algorithm>
            #include
            <cstdio>
            #include
            <cstring>
            #include
            <cassert>
            using namespace std;
            #define MAX 210
            #define MAXINT 999999999

            struct pipe
            {
                
                __int64 a;
                __int64 b;
                __int64 l;
                __int64 r;
            }
            mypipe[MAX*1000];

            __int64 n,m;
            __int64 graph[MAX][MAX];
            __int64 d[MAX];
            __int64 ans
            =0;

            __int64 min(__int64 a,__int64 b)
            {
                
                
            if(a<b)
                    
            return a;
                
            else
                    
            return b;
            }


            void init()
            {
                
                __int64 i;
                memset(graph,
            0,sizeof(graph));
                
                
            for(i=1;i<=m;i++)
                
            {
                    scanf(
            "%I64d%I64d%I64d%I64d",&mypipe[i].a,&mypipe[i].b,&mypipe[i].l,&mypipe[i].r);
                    graph[mypipe[i].a][mypipe[i].b]
            +=mypipe[i].r-mypipe[i].l;
                    graph[mypipe[i].a][n
            +2]+=mypipe[i].l;
                    graph[n
            +1][mypipe[i].b]+=mypipe[i].l;
                }

            }

            bool build(__int64 n)
            {
                
                memset(d,
            0,sizeof(d));
                
            bool visit[MAX]={0};
                __int64 myqueue[MAX
            *MAX]={0};
                
                __int64 front
            =1,rear=1;
                myqueue[rear]
            =n-1;visit[myqueue[front]]=true;
                
            while(front<=rear) 
                
            {
                    
                    __int64 i;
                    
            for(i=1;i<=n;i++)
                    
            {
                        
            if((!visit[i])&&graph[myqueue[front]][i]>0)
                        
            {
                            rear
            ++;
                            myqueue[rear]
            =i;
                            d[i]
            =d[myqueue[front]]+1;
                            visit[i]
            =true;
                            
                        }

                    }

                    
                    front
            ++;
                }

                
            if(visit[n]==true)
                    
            return true;
                
            else
                    
            return false;
            }


            __int64 dinic(__int64 v,__int64 sum,__int64 n)
            {
                
            if(v==n)
                    
            return sum;
                __int64 ret
            =0;
                __int64 t;
                __int64 i;
                
            for(i=1;i<=n;i++)
                
            {
                    
            if(d[i]==d[v]+1&&graph[v][i]>0)
                    

                        t
            =dinic(i,min(graph[v][i],sum)-ret,n);
                        graph[v][i]
            -=t; 
                        graph[i][v]
            +=t;
                        ret
            +=t;
                    }

                }
             
                
            return ret;
            }



            int main()
            {
                
                __int64 j;
                __int64 flag
            =0;
                
                
                
            while(scanf("%I64d%I64d",&n,&m)!=EOF)
                
            {

                    
                    
                    init();
                    flag
            =0;
                    
            while(build(n+2))
                    
            {
                        dinic(n
            +1,MAXINT,n+2);
                    }

                    
            for(j=1;j<=n;j++)
                    
            {
                        
                        
            if(graph[j][n+2]!=0||graph[n+1][j]!=0)
                        
            {
                            
                            flag
            =1;
                            
            break;
                        }

                    }

                    
            if(flag==1)
                    
            {
                        printf(
            "NO\n\n");
                        
            continue;
                    }

                    
            else
                    
            {
                        printf(
            "YES\n");
                        
            for(j=1;j<=m;j++)
                        
            {
                            
                            printf(
            "%I64d\n",graph[mypipe[j].b][mypipe[j].a]+mypipe[j].l);
                        }

                        printf(
            "\n");
                    }

                    
                }

                
            return 0;
            }
             

            posted on 2009-07-12 01:58 abilitytao 閱讀(638) 評論(2)  編輯 收藏 引用

            評論

            # re: 求SGU 194即ZOJ 2314題AC代碼 2009-09-04 17:25 402158021@qq.com

            可能是dinic有問題
            給你我的代碼
            #include<iostream>
            #include<stdio.h>
            #include<algorithm>
            #include<cmath>
            #include<string>
            #include<queue>
            #include<string.h>

            using namespace std;

            int map[300][300];
            int start,end,en,vn;
            int path[300],flow[300];
            int maxf=0;

            struct Pipe
            {
            int px,py,pl,pc;
            }pipe[1000000];

            int bfs()
            {
            int i,j,k;
            int cur=0;
            memset(path,-1,sizeof(path));
            memset(flow,0,sizeof(flow));

            path[start]=start;
            flow[start]=0x0fffffff;

            queue<int> q;
            q.push(start);
            while(!q.empty())
            {
            cur=q.front();
            // printf("cur=%d\tend=%d\n",cur,end);
            q.pop();
            if(cur==end)break;
            // printf("vn=%d\n",vn);
            for(i=0;i<vn;i++)
            {
            // printf("11111\n");
            if(path[i]==-1&&map[cur][i])
            {
            path[i]=cur;
            q.push(i);
            flow[i]=flow[cur]<map[cur][i]?flow[cur]:map[cur][i];
            }
            }
            }
            // printf("fff=%d\n",flow[end]);
            if(path[end]==-1)return -1;
            return flow[end];
            }


            int maxflow()
            {
            int i,j,k;
            int pre,cur;
            while(1)
            {
            k=bfs();
            if(k==-1)break;
            maxf+=k;
            cur=end;
            while(cur!=start)
            {
            pre=path[cur];
            map[pre][cur]-=k;
            map[cur][pre]+=k;
            cur=pre;
            }
            }
            return maxf;
            }

            int main()
            {
            int i,j,k;
            while(scanf("%d %d",&vn,&en)!=EOF)
            {
            memset(map,0,sizeof(map));
            memset(pipe,0,sizeof(pipe));
            maxf=0;
            start=0;end=vn+1;
            for(i=0;i<en;i++)
            {
            scanf("%d%d%d%d",&pipe[i].px,&pipe[i].py,&pipe[i].pl,&pipe[i].pc);
            map[pipe[i].px][pipe[i].py]+=pipe[i].pc-pipe[i].pl;
            map[start][pipe[i].py]+=pipe[i].pl;
            map[pipe[i].px][end]+=pipe[i].pl;
            }
            vn+=2;
            k=maxflow();
            int ok=1;
            for(i=0;i<en;i++)
            {
            if(map[start][pipe[i].py]!=0||map[pipe[i].px][end]!=0)
            {
            ok=0;break;
            }
            }
            if(!ok)
            printf("NO\n");
            else
            {
            printf("YES\n");
            for(i=0;i<en;i++)
            printf("%d\n",map[pipe[i].py][pipe[i].px]+pipe[i].pl);
            }
            }
            return 0;
            }


              回復(fù)  更多評論   

            # re: 求SGU 194即ZOJ 2314題AC代碼 2009-09-04 18:01 abilitytao

            @402158021@qq.com
            多謝^_^  回復(fù)  更多評論   


            只有注冊用戶登錄后才能發(fā)表評論。
            網(wǎng)站導(dǎo)航: 博客園   IT新聞   BlogJava   博問   Chat2DB   管理


            国产成人精品久久| 国产69精品久久久久99| 狠狠色婷婷综合天天久久丁香| 岛国搬运www久久| 久久国产乱子伦免费精品| 国产精品美女久久久| 久久无码人妻精品一区二区三区 | 性做久久久久久免费观看| 精品久久久久久久国产潘金莲| 亚洲国产精品久久电影欧美| 韩国无遮挡三级久久| 国产亚洲精品自在久久| 亚洲?V乱码久久精品蜜桃| 久久毛片一区二区| 精品久久人人妻人人做精品| 亚洲中文字幕无码久久精品1 | 成人国内精品久久久久影院VR| 青青草原综合久久大伊人精品| 中文精品久久久久人妻不卡| 无码日韩人妻精品久久蜜桃| 国内精品久久久久影院日本| 日本福利片国产午夜久久| 久久久久国产一区二区三区| 天天久久狠狠色综合| 色欲综合久久躁天天躁| 久久精品一本到99热免费| 国产呻吟久久久久久久92| 亚洲人成无码www久久久| 久久综合伊人77777麻豆| 午夜精品久久久久久久久| 国产精品久久久久久福利漫画| 国产精品无码久久综合网| 中文字幕人妻色偷偷久久| 国产精品xxxx国产喷水亚洲国产精品无码久久一区 | 午夜精品久久久久久| 99久久中文字幕| 一本久久知道综合久久| 久久夜色精品国产| 99久久人妻无码精品系列蜜桃| 女人高潮久久久叫人喷水| 精品久久久久久无码国产|