AC_Dream 1211 Reactor Cooling

  1 /*
  2     題意:無源無匯,并且每條邊的容量有上下界限的網絡流問題!既然無源無匯,那么素有的節點都應該滿足“入流==出流”!
  3          輸出每一條邊的流量,使得滿足上面的條件。(如果u->v有流量,那么v->u就不會有流量)
  4 
  5     思路:如果增加了源點s和匯點t,對于u->v(下限為l, 上限為f) 將這一條邊拆成3條,s->v(容量為l), u->v(容量為f-l)
  6      u->t(容量為l)這樣就變成了每一個點的流入或者流出的流量至少是b!然后從s->t走一遍最大流,如果所有的附件邊都已經
  7      滿載,則就是所有s->v的邊和u->t的邊(或者只判斷其中一者就可以),那么就存在答案!
  8 */
  9 #include<iostream>
 10 #include<cstdio>
 11 #include<cstring>
 12 #include<algorithm>
 13 #include<vector>
 14 #include<queue>
 15 #define INF 0x3f3f3f3f
 16 #define N 205
 17 #define M 500000
 18 using namespace std;
 19 
 20 struct EDGE{
 21     int v, cap, tot, nt, b;
 22     EDGE(){};
 23     EDGE(int v, int cap, int nt, int b) : v(v), cap(cap), nt(nt), b(b), tot(cap){}
 24 };
 25 
 26 EDGE edge[M];
 27 int n, m;
 28 int first[N];
 29 int pre[N], d[N];
 30 int sz;
 31 int s, t;
 32 int full, fout; 
 33 
 34 void addEdge(int u, int v, int b, int cap){
 35     edge[sz] = (EDGE(v, cap, first[u],b));
 36     first[u] = sz++;
 37     edge[sz] = (EDGE(u, 0, first[v], 0));
 38     first[v] = sz++;
 39 
 40     edge[sz] = (EDGE(v, b, first[s], 0));
 41     first[s] = sz++;
 42     edge[sz] = (EDGE(s, 0, first[v], 0));
 43     first[v] = sz++;
 44 
 45     edge[sz] = (EDGE(t, b, first[u], 0));
 46     full += b;
 47     first[u] = sz++;
 48     edge[sz] = (EDGE(u, 0, first[t], 0));
 49     first[t] = sz++;
 50 }
 51 
 52 bool bfs(){
 53     queue<int>q;
 54     memset(d, 0, sizeof(d));
 55     d[s] = 1;
 56     q.push(s);
 57     while(!q.empty()){
 58         int u = q.front(); q.pop();
 59         for(int i = first[u]; ~i; i = edge[i].nt){
 60             int v = edge[i].v;
 61             if(!d[v] && edge[i].cap >0){
 62                 d[v] = d[u] + 1;
 63                 q.push(v);
 64             }
 65         }
 66     }
 67     if(d[t] == 0) return false;
 68     return true;
 69 }
 70 
 71 int dfs(int u, int totf){
 72     int ff;
 73     if( u == t) return totf;
 74     int flow = 0;
 75     for(int i = first[u]; ~i && totf > flow; i = edge[i].nt){
 76         int v = edge[i].v;
 77         int cap = edge[i].cap;
 78         //流入u節點的當前總的流量為totf,可以得到 u->v1, u->v2, u->v3....這些路徑上的最大流的和為flow+=f(u->vi)
 79         //f(u->vi)表示u節點沿著vi節點方向的路徑上的最大流;如果u->vi+1的容量為wi+1,那么u->vi+1所允許流過的最大
 80         //的流量就是 min(totf - cost, wi+1)了!
 81         if(d[v] == d[u] + 1 && cap > 0 ){
 82             ff = dfs(v, min(totf - flow, cap));
 83             if(ff){
 84                 edge[i].cap -= ff;
 85                 edge[i^1].cap += ff;
 86                 flow += ff;
 87             }
 88             else
 89                 d[v] = -1;//表示v這個點無法在繼續增廣下去了
 90         }
 91     }
 92     return flow;//返回從u節點向外流出的最大流量!
 93 }
 94 
 95 bool Dinic(){
 96     while(bfs())
 97         fout += dfs(0, INF);//這一塊沒想到寫成while(dfs())會超時....
 98 
 99     if( fout != full) return false;
100     return true;
101 }
102 
103 int main(){
104      
105         scanf("%d%d", &n, &m);
106     memset(first, -1, sizeof(first));
107     sz = 0;
108     fout = full = 0;
109     s = 0; t = n+1;
110     int u, v, l, f;
111     for(int i = 1; i <= m; ++i){
112         scanf("%d%d%d%d", &u, &v, &l, &f);
113         addEdge(u, v, l, f-l);
114     }
115     if(!Dinic()){
116         printf("NO\n");
117         return 0;
118     }
119     printf("YES\n");
120     for(int i = 1; i <= m; ++i){
121         int j = (i-1)*6;
122         printf("%d\n",  edge[j].tot - edge[j].cap + edge[j].b);//輸出這條邊實際流過的流量+下限
123     }
124 
125     return 0;
126 }

?

轉載于:https://www.cnblogs.com/hujunzheng/p/4006435.html

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/531611.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/531611.shtml
英文地址,請注明出處:http://en.pswp.cn/news/531611.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

c語言中const對于define優點,為什么大多數C開發人員使用define而不是const?

這有一個非常可靠的原因&#xff1a;C中的const并不意味著一些常量。 這只是意味著一個variables是只讀的。在編譯器需要一個常量的地方(例如非VLA數組的數組大小)&#xff0c;使用constvariables(如fieldWidth是不可能的。他們不一樣const只是一個限定符&#xff0c;它表示一個…

c語言程序設計期末試卷A,《C語言程序設計》期末試卷(A)..doc

《C語言程序設計》期末試卷(A).2011-12-1學期《C語言程序設計》期末試卷(A)班級____________姓名____________學號________________大題號一二三四總分得 分判卷 /核分人“一、選擇題”使用答題卡選擇。“二、看程序寫運行結果”答題處&#xff1a;題號答 案二、1二、2二、3“三…

codeforces B. Strongly Connected City(dfs水過)

題意&#xff1a;有橫向和縱向的街道&#xff0c;每個街道只有一個方向&#xff0c;垂直的街道相交會產生一個節點&#xff0c;這樣每個節點都有兩個方向&#xff0c; 問是否每一個節點都可以由其他的節點到達.... 思路&#xff1a;規律沒有想到&#xff0c;直接爆搜&#xff0…

c語言數組兩個值交換,如可交換兩個數組中的元素?

該樓層疑似違規已被系統折疊 隱藏此樓查看此樓#include #include #include int main(void){int a[]{1,2,3,4,5,6,7,8};int b[]{9,10,11,12,13,15};int lena,lenb,randa,randb,randtimes;int i,temp;srand((unsigned)time(NULL));lena sizeof(a)/sizeof(int);lenb sizeof(b)/s…

Uvaoj 11248 Frequency Hopping(Dinic求最小割)

題意&#xff1a;1到n節點&#xff08;節點之間有一定的容量&#xff09;&#xff0c;需要流過C的流量&#xff0c;問是否可以&#xff1f;如果可以輸出possible&#xff0c; 否則如果可以擴大任意一條邊的容量 可以達到目的&#xff0c;那么輸出possible option&#xff1a;接…

隨機數歸并排序c語言,用C語言實現歸并排序

#include#include#include#include#define random(i) (rand()%i)#define N 12#define INFINITY 99999999//要排序的數存放在a數組匯總&#xff0c;p,q,r是數組下標void Merge(int *a,int p,int q,int r){int n1q-p1;int n2r-q;int *L(int *)malloc(sizeof(int)*n1);int *R(int …

UVAoj 11324 - The Largest Clique(tarjan + dp)

題意&#xff1a;給定一個有向圖&#xff0c;尋找一個點數最大集合&#xff0c;使得這個集合中的任意兩個點 u,v, 都有u->v 或者 v->u 或者u<>v 思路&#xff1a;首先將強連通分量通過tarjan算法求出來&#xff0c;然后進行縮點&#xff0c;也就是每一個縮點 所組成…

android開發藍牙自動連接電腦上,Android藍牙開發之自動連接設備

自動連接使用的是SharedPreferences這個來解決。private void Automaticconnection() {SharedPreferences sp getSharedPreferences("Dizhi", MODE_PRIVATE);String address sp.getString("address", "");if (!address.equals("")) …

hdu 2014鞍山賽區 5073 Galaxy

題意&#xff1a;就是給你 n 個數&#xff0c;代表n個星球的位置&#xff0c;每一個星球的重量都為 1 &#xff01; 開始的時候每一個星球都繞著質心轉動&#xff0c;那么質心的位置就是所有的星球的位置之和 / 星球的個數 現在讓你移動 k 個星球到任意位置&#xff08;多個星球…

android onitemclicklistener 參數,android – 對listview中的項使用setOnItemClickListener

大家好,有一個應用程序,可以在SD卡上保存音頻.我創建了一個listview,它從sdcard中檢索文件名.我正在嘗試設置一個監聽器,所以當單擊文件名時,我可以啟動另一個播放該文件的意圖.當我嘗試設置監聽器并傳入一個新的OnItemClickListener()時,eclipse是紅色的下劃線.我知道我必須實…

DRF之請求與響應

目錄 一、模塊與包回顧 二、反序列化校驗源碼分析(了解) 三、斷言 四、drf之請求 【1】源碼分析 【2】配置視圖類能處理的編碼格式 五、drf之響應 【1】源碼 【2】響應編碼格式 一、模塊與包回顧 模塊與包 什么是模塊&#xff1f; 一個py文件&#xff0c;被別的py文件…

android 常用注解,Android 開發小工具之:注解 Annotation

Android Support 包之一的 support-annotations是通過靜態編譯檢測來提高代碼質量的一個注解工具。里面包含了 Android 開發中常用的代碼檢測注解&#xff0c;幫助開發者提高代碼質量。通過 SDK Manager下載 Android Support Repository 后&#xff0c;在 Gradle 中通過如下聲明…

codeforces B. Friends and Presents(二分+容斥)

題意&#xff1a;從1....v這些數中找到c1個數不能被x整除&#xff0c;c2個數不能被y整除&#xff01; 并且這c1個數和這c2個數沒有相同的&#xff01;給定c1, c2, x, y&#xff0c; 求最小的v的值&#xff01; 思路&#xff1a; 二分容斥&#xff0c;二分找到v的值&#xff0c;…

android音量鍵廣播,音量控制鍵控制的音頻流(setVolumeControlStream)描述

音量控制鍵控制的音頻流(setVolumeControlStream)描述2021-01-03 16:18Android教程網 Android當開發多媒體應用或者游戲應用的時候&#xff0c;需要使用音量控制鍵來設置程序的音量大小,在Android系統中有多種音頻流,感興趣的朋友可以了解下當開發多媒體應用或者游戲應用的時候…

eclipse的使用

eclipse如何打開一個已存在的工程&#xff01;先給eclipse創建一個workspace,這個workspace就是一個文件夾用來管理eclipse項目的&#xff0c;或者修改eclipse的workspace,選擇菜單file->switch workspace->other,選擇一個已經存在的workspace。將已經存在的項目導入到wo…

Android延伸布局到狀態欄,Android 狀態欄透明

前言&#xff1a;最近項目大量用到狀態欄透明&#xff0c;網上也出現很多庫可以直接拿來用&#xff0c;個人認為沒有必要那么重引用到一個庫(有木有同學和我有一樣的想法)&#xff0c;所以研究了一番&#xff0c;在此做個記錄加強記憶也便后期查閱&#xff0c;如果無意中有幸能…

glassfish服務器默認的網頁所在的位置

http://localhost:8080/ 默認打開的網頁所在的位置 E:/glassfish-4.1/glassfish/domains/domain1/docroot/index.html 轉載于:https://www.cnblogs.com/hujunzheng/p/4052920.html

華為HarmonyOS 鴻蒙,華為鴻蒙HarmonyOS2.0手機開發者Beta版正式發布

據悉&#xff0c;本次手機開發者Beta測試支持以下中國境內主制式手機及平板電腦。手機&#xff1a;全網通(5G雙卡)P40 、 全網通版P40 Pro、Mate30、Mate30(5G) 、Mate30 Pro、Mate30 Pro(5G)&#xff0c;型號清單為ANA-AN00、ELS-AN00、TAS-AL00、TAS-AN00、LIO-AL00、LIO-AN0…

http協議客戶端向服務器端請求時一般需要發送的內容

out.println("GET /shopping/index.html HTTP/1.1");//請求行 包括請求方式&#xff0c;文件路徑&#xff0c; http協議版本&#xff08;必寫&#xff09;請求頭.... out.println("Aceept: */*");//客戶端能夠處理的文件類型&#xff08;不是必須&#xff…

android oneshot自動播放bug,移動端常見bug匯總001

前言本文是摘錄整理了移動端常見的一些bug以及解決方案&#xff0c;第一篇&#xff0c;后面還會有持續的文章更新整理。點擊樣式閃動Q: 當你點擊一個鏈接或者通過Javascript定義的可點擊元素的時候&#xff0c;它就會出現一個半透明的灰色背景。A:根本原因是-webkit-tap-highli…