hdu 4940 无源汇有上下界最大流

2015-07-20 17:50:28 · 作者: · 浏览: 4
/*
\
题意:给出一个有向强连通图,每条边有两个值分别是破坏该边的代价和把该边建成无向边的代价(建立无向边的前提是删除该边)问是否存在一个集合S,和一个集合的补集T,破坏所有S集合到T集合的边代价和是X,然后修复T到S的边为无向边代价和是Y,满足Y
  
   vc3Bhbj4KIMjnufu05tTav8nQ0MH3ICDEx8O0y7XD97bU09rIztLitcQgUyC8r7rPwfez9rXEv8+2qLXI09ogwffI67XEo6wgwfez9rXEvMbL47XEIFggv8+2qNCh09q1yNPa1eK49sH3wb+jqFjKx8/CvefWrrrNo6mjrCC8xsvjs/bAtLXEWSCjqMnPvefWrrrNo6m/z7aotPPT2rXI09og1eK49sH3wb8gIL/PtqjC+tfjWDw9WaGjCiovCiNpbmNsdWRlPHN0ZGlvLmg+CiNpbmNsdWRlPHN0cmluZy5oPgojaW5jbHVkZTxxdWV1ZT4KdXNpbmcgbmFtZXNwYWNlIHN0ZDsKI2RlZmluZSBOIDMwMAojZGVmaW5lIGluZiAweDNmZmZmZmZmCnN0cnVjdCBub2RlIHsKICAgaW50IHUsdix3LG5leHQ7Cn1iaWFuW04qTiozXTsKaW50IGhlYWRbTl0seW9uZyxkaXNbTl0sd29ya1tOXTsKdm9pZCBpbml0KCl7Cnlvbmc9MDsKbWVtc2V0KGhlYWQsLTEsc2l6ZW9mKGhlYWQpKTsKfQp2b2lkIGFkZGJpYW4oaW50IHUsaW50IHYsaW50IHcpIHsKYmlhblt5b25nXS51PXU7CmJpYW5beW9uZ10udj12OwpiaWFuW3lvbmddLnc9dzsKYmlhblt5b25nXS5uZXh0PWhlYWRbdV07CmhlYWRbdV09eW9uZysrOwp9CnZvaWQgYWRkKGludCB1LGludCB2LGludCB3KSB7CmFkZGJpYW4odSx2LHcpOwphZGRiaWFuKHYsdSwwKTsKfQppbnQgbWluKGludCBhLGludCBiKQp7CiAgICByZXR1cm4gYTxiP2E6YjsKfQppbnQgYmZzKGludCBzLGludCB0KQp7CiAgICBtZW1zZXQoZGlzLC0xLHNpemVvZihkaXMpKTsKICAgIHF1ZXVlPGludD5xOwogICAgcS5wdXNoKHMpOwogICAgZGlzW3NdPTA7CiAgICB3aGlsZSghcS5lbXB0eSgpKQogICAgewogICAgICAgIGludCB1PXEuZnJvbnQoKTsKICAgICAgICBxLnBvcCgpOwogICAgICAgIGZvcihpbnQgaT1oZWFkW3VdO2khPS0xO2k9YmlhbltpXS5uZXh0KQogICAgICAgIHsKICAgICAgICAgICAgaW50IHY9YmlhbltpXS52OwogICAgICAgICAgICBpZihiaWFuW2ldLncmYW1wOyZhbXA7ZGlzW3ZdPT0tMSkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgZGlzW3ZdPWRpc1t1XSsxOwogICAgICAgICAgICAgICAgcS5wdXNoKHYpOwogICAgICAgICAgICAgICAgaWYodj09dCkKICAgICAgICAgICAgICAgICAgICByZXR1cm4gMTsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgIH0KICAgIHJldHVybiAwOwp9CmludCBkZnMoaW50ICBzLGludCBsaW1pdCxpbnQgdCkKewogICAgaWYocz09dClyZXR1cm4gbGltaXQ7CiAgICBmb3IoaW50ICZhbXA7aT13b3JrW3NdO2khPS0xO2k9YmlhbltpXS5uZXh0KQogICAgewogICAgICAgIGludCB2PWJpYW5baV0udjsKICAgICAgICBpZihiaWFuW2ldLncmYW1wOyZhbXA7ZGlzW3ZdPT1kaXNbc10rMSkKICAgICAgICB7CiAgICAgICAgICAgIGludCB0dD1kZnModixtaW4obGltaXQsYmlhbltpXS53KSx0KTsKICAgICAgICAgICAgaWYodHQpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIGJpYW5baV0udy09dHQ7CiAgICAgICAgICAgICAgICBiaWFuW2leMV0udys9dHQ7CiAgICAgICAgICAgICAgICByZXR1cm4gdHQ7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICB9CiAgICByZXR1cm4gMDsKfQppbnQgZGluaWMoaW50IHMsaW50IHQpCnsKICAgIGludCBhbnM9MDsKICAgIHdoaWxlKGJmcyhzLHQpKQogICAgewogICAgICAgIG1lbWNweSh3b3JrLGhlYWQsc2l6ZW9mKGhlYWQpKTsKICAgICAgICB3aGlsZShpbnQgdHQ9ZGZzKHMsaW5mLHQpKQogICAgICAgICAgICBhbnMrPXR0OwogICAgfQogICAgcmV0dXJuIGFuczsKfQppbnQgbWFpbigpewogICAgICAgIGludCBzdW0sYSxiLGMsVCxkLGFucyxpLGs9MCxuLG0sdCxTLHdbTl07CiAgICAgICAgc2NhbmYo"%d",&t);
        while(t--) {
                init();
            scanf("%d%d",&n,&m);
        S=0;T=n+1;
        memset(w,0,sizeof(w));
            for(i=1;i<=m;i++) {
                scanf("%d%d%d%d",&a,&b,&c,&d);
                add(a,b,d);
               w[b]+=c;
               w[a]-=c;
            }
            sum=0;
            for(i=1;i<=n;i++) {
                if(w[i]>
0) { sum+=w[i]; add(S,i,w[i]); } if(w[i]<0) add(i,T,-w[i]); } ans=dinic(S,T); if(sum==ans) printf("Case #%d: happy\n",++k); else printf("Case #%d: unhappy\n",++k); } return 0; }