poj 2195 Going Home

  1 /*
  2    做網絡流的題建圖真的是太重要了!
  3    本題是將人所在的位置和房子所在的位置建立邊的聯系,其中man到house這一條邊的流量為 1, 費用為兩者的距離
  4    而方向邊的流量為 0, 費用為正向邊的相反數(也就是沿著反向邊進行增廣時,費用要減少,更改先前錯誤的選擇) 
  5    最后增加一個源點和一個匯點完畢(源點映射到man, house映射到匯點, 費用為0, 流量為1) 
    
6 */ 7 #include<iostream> 8 #include<cmath> 9 #include<cstdio> 10 #include<cstring> 11 #include<queue> 12 #define Max 0x3f3f3f3f 13 #define N 205 14 using namespace std; 15 16 class node 17 { 18 public: 19 int x, y; 20 }; 21 22 node xyM[N]; 23 node xyH[N]; 24 int cost[N][N], cap[N][N]; 25 int cntM, cntH; 26 int pre[N*2], dist[N*2], vis[N*2], n, m; 27 28 void addE(int i, int j, int ct, int cp) 29 { 30 cost[i][j]=ct; 31 cap[i][j]=cp; 32 cost[j][i]=-ct; 33 //cap[j][i]=0; 34 } 35 36 int s, t, minCost; 37 38 void buildMap() 39 { 40 int i, j; 41 memset(cap, 0, sizeof(cap)); 42 s=0; t=cntM+cntH+1; 43 for(i=0; i<cntM; ++i) 44 addE(0, i+1, 0, 1); 45 for(i=0; i<cntH; ++i) 46 addE(cntM+i+1, t, 0, 1); 47 for(i=0; i<cntM; ++i) 48 for(j=0; j<cntH; ++j) 49 addE(i+1, cntM+j+1, abs(xyM[i].x-xyH[j].x)+abs(xyM[i].y-xyH[j].y), 1); 50 } 51 52 queue<int>q; 53 54 int spfa() 55 { 56 int u, v; 57 memset(dist, 0x3f, sizeof(dist)); 58 dist[0]=0; 59 q.push(0); 60 vis[0]=1; 61 while(!q.empty()) 62 { 63 u=q.front(); 64 q.pop(); 65 vis[u]=0; 66 for(v=0; v<=t; ++v) 67 if(cap[u][v]>0 && dist[v]>dist[u]+cost[u][v]) 68 { 69 dist[v]=dist[u]+cost[u][v]; 70 pre[v]=u; 71 if(!vis[v]) 72 { 73 vis[v]=1; 74 q.push(v); 75 } 76 } 77 } 78 if(dist[t]==Max) 79 return 0; 80 return 1; 81 } 82 83 void updateEdge() 84 { 85 int u, minFlow=Max; 86 for(u=t; u!=s; u=pre[u])//通過最短路徑尋找這條路徑上的最小流量 87 if(cap[pre[u]][u]<minFlow) 88 minFlow=cap[pre[u]][u]; 89 for(u=t; u!=s; u=pre[u]) 90 { 91 cap[pre[u]][u]-=minFlow; 92 cap[u][pre[u]]+=minFlow; 93 minCost+=cost[pre[u]][u]; 94 } 95 } 96 97 int main() 98 { 99 int i, j; 100 char c; 101 while(scanf("%d%d", &n, &m) && (n||m)) 102 { 103 cntM=cntH=0; 104 minCost=0; 105 for(i=1; i<=n; ++i) 106 { 107 getchar(); 108 for(j=1; j<=m; ++j) 109 { 110 scanf("%c", &c); 111 if(c=='m') 112 { 113 xyM[cntM].x=i; 114 xyM[cntM++].y=j; 115 } 116 else if(c=='H') 117 { 118 xyH[cntH].x=i; 119 xyH[cntH++].y=j; 120 } 121 } 122 } 123 buildMap(); 124 while(spfa()) 125 updateEdge(); 126 printf("%d\n", minCost); 127 } 128 return 0; 129 }

?//鄰接表

  1 #include<iostream>
  2 #include<queue>
  3 #include<cstring>
  4 #include<cstdio>
  5 #include<algorithm>
  6 #define INF 0x3f3f3f3f
  7 #define N 1000005
  8 using namespace std;
  9 
 10 int cntH, cntM;
 11 
 12 struct node{
 13     int x, y;
 14 };
 15 
 16 struct EDGE{
 17     int u, v, cap, cost, nt;
 18 };
 19 EDGE edge[N];
 20 
 21 queue<int>q;
 22 node man[105], house[105];
 23 int first[205];
 24 int dist[205];
 25 int pre[205], flow[205], vis[205];
 26 int cnt, t;
 27 int minCost;
 28 int n, m;
 29 
 30 void addEdge(int u, int v, int cap, int cost){
 31     edge[cnt].u=u;
 32     edge[cnt].v=v;
 33     edge[cnt].cap=cap;
 34     edge[cnt].nt=first[u];
 35     edge[cnt].cost=cost;
 36     first[u]=cnt++;
 37     
 38     edge[cnt].u=v;
 39     edge[cnt].v=u;
 40     edge[cnt].cap=0;
 41     edge[cnt].nt=first[v];
 42     edge[cnt].cost=-cost;
 43     first[v]=cnt++;
 44 }
 45 
 46 void buildMap(){
 47     memset(first, -1, sizeof(first));
 48     t=cntH+cntM+1;
 49     for(int i=1; i<=cntM; ++i)
 50         for(int j=1; j<=cntH; ++j)
 51             addEdge(i, cntM+j, 1, abs(man[i].x-house[j].x) + abs(man[i].y-house[j].y));
 52     for(int i=1; i<=cntM; ++i)
 53         addEdge(0, i, 1, 0);
 54     for(int i=1; i<=cntH; ++i)
 55         addEdge(cntM+i, t, 1, 0); 
 56 }
 57 
 58 bool MCMF(){
 59     memset(dist, 0x3f, sizeof(dist));
 60     memset(vis, 0, sizeof(vis));
 61     q.push(0);
 62     flow[0]=INF;
 63     dist[0]=0;
 64     vis[0]=1;
 65     while(!q.empty()){
 66         int u=q.front(); q.pop();
 67         vis[u]=0;
 68         for(int e=first[u]; ~e; e=edge[e].nt){
 69             int v=edge[e].v, cap=edge[e].cap, cost=edge[e].cost;
 70             if(cap>0 && dist[v]>dist[u]+cost){
 71                 dist[v]=dist[u]+cost;
 72                 flow[v]=min(flow[u], cap);
 73                 pre[v]=e;
 74                 if(!vis[v]){
 75                     vis[v]=1;
 76                     q.push(v);
 77                 }
 78             }
 79         }
 80     }
 81     if(dist[t]==INF) return false;
 82     minCost+=dist[t];
 83     int x=t;
 84     while(x!=0){
 85         edge[pre[x]].cap-=flow[t];
 86         edge[pre[x]^1].cap+=flow[t];
 87         x=edge[pre[x]].u;
 88     }
 89     return true;
 90 }
 91  
 92 int main(){
 93     while(scanf("%d%d", &n, &m) && (n||m)){
 94         cnt=cntH=cntM=0;
 95         for(int i=1; i<=n; ++i){
 96             getchar();
 97             for(int j=1; j<=m; ++j){
 98                 char ch;
 99                 scanf("%c", &ch);
100                 if(ch=='m'){
101                     man[++cntM].x=i;
102                     man[cntM].y=j;
103                 }
104                 else if(ch=='H'){
105                     house[++cntH].x=i;
106                     house[cntH].y=j;
107                 }
108             }
109         }
110         buildMap();
111         minCost=0;
112         while(MCMF());
113         printf("%d\n", minCost);
114     }
115     return 0;
116 } 

?

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

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

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

相關文章

CardLayout布局練習(小的圖片瀏覽器)

1 /*2 涉及Panel中的圖片的加載&#xff0c;還有Frame的關閉的方法&#xff0c; CardLayout&#xff08;int hgap, int vgap&#xff09;就會決定卡片面板的大小3 匿名類的使用。。。4 */5 import java.awt.*;6 import java.awt.event.*;7 import javax.swing.*;8 public class…

python求逆矩陣的方法,Python 如何求矩陣的逆

我就廢話不多說了&#xff0c;大家還是直接看代碼吧~import numpy as npkernel np.array([1, 1, 1, 2]).reshape((2, 2))print(kernel)print(np.linalg.inv(kernel))注意&#xff0c;Singular matrix奇異矩陣不可求逆補充&#xff1a;pythonnumpy中矩陣的逆和偽逆的區別定義&a…

plsql存過聲明游標_plsql編程學習之游標一

oralce plsql編程的游標游標分類1顯示游標2隱式游標隱式游標&#xff0c;oracle自動管理&#xff0c;不用聲明&#xff0c;打開和關閉&#xff0c;ORACLE自動處理&#xff0c;使用隱式游標%FOUND時&#xff0c;需要加上 SQL%FOUND顯示游標&#xff0c;需要自己聲明&#xff0c;…

用命令行編譯java并生成可執行的jar包

用命令行編譯java并生成可執行的jar包 1.編寫源代碼。 編寫源文件&#xff1a;CardLayoutDemo.java并保存&#xff0c;例如&#xff1a;I:\myApp\CardLayoutDemo.java。程序結構如下&#xff1a;package test;import java.awt.*; import javax.swing.*; //更多包的導入...clas…

python計時器單位,python(計時器)

計時器要求&#xff1a;定制一個計時器的類start 和 stop方法代表啟動計時和停止計時假設計時器對象 t1&#xff0c;print(t1)和直接調用t1 均顯示結果當計時器未啟動或已停止計時&#xff0c;調用stop方法能給予溫馨提示兩個計時器對象可以相加&#xff1a; t1 t2只能使用提供…

查詢分析300萬筆記錄_給你100萬條數據的一張表,你將如何查詢優化?

1.兩種查詢引擎查詢速度(myIsam 引擎)InnoDB 中不保存表的具體行數&#xff0c;也就是說&#xff0c;執行select count(*) from table時&#xff0c;InnoDB要掃描一遍整個表來計算有多少行。MyISAM只要簡單的讀出保存好的行數即可。注意的是&#xff0c;當count(*)語句包含 whe…

poj 3321 Apple Trie

/*poj 3321 Apple Trie 這道題的關鍵是如何將一個樹建成一個一維數組利用樹狀數組來解題&#xff01;可以利用dfs&#xff08;&#xff09;來搞定&#xff0c;我們在對一個節點深搜后&#xff0c;所經過的節點的數目就是該節點的子樹的數目所以我們利用start[i]數組來記錄 i 節…

php美團項目分享,美團項目(純代碼)(示例代碼)

一.框架搭建1.icon規格要求可從文檔中查找,搜索app icon.2.因為很多界面重復利用,所以不用storyboarda.刪除stroyboard,在設置中Info -> Main storyboard file base name 項直接去除b.創建ZXHomeViewController(UICollectionViewController)和ZXNavigationController(UINavi…

ioc spring 上機案例_Spring的IoC入門案例

1、創建工程&#xff0c;導入坐標1.1 創建工程1.2 導入坐標xmlns:xsi"http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation"http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">4.0.0org.examplespring_01_io…

java中父類與子類, 不同的兩個類中的因為構造函數由于遞歸調用導致棧溢出問題...

1 /*2 對于類中對成員變量的初始化和代碼塊中的代碼全部都挪到了構造函數中&#xff0c;3 并且是按照java源文件的初始化順序依次對成員變量進行初始化的&#xff0c;而原構造函數中的代碼則移到了構造函數的最后執行4 */5 import static java.lang.System.out;6 7 public clas…

liunx php的項目地址,在 Linux 配置 PHP 項目

在 Linux 配置 PHP 項目一, 搭建測試環境軟件環境:(PHP 項目)PHP5.4Apache(httpd2.4)mysql5.7二, 安裝1掛載:1. 把 iso 的鏡像文件放到虛擬機 Linux 的 CD/ROM(在右下角 (網絡適配器 / 橋接模式) 旁有個光盤, 點擊連接, 之后頁面出現一個光盤)2. 使用掛載命令, 把 CD/ROM 設備里…

springwebflux 頁面_【SpringBoot WEB系列】WebFlux靜態資源配置與訪問

上一篇博文介紹SpringMVC的靜態資源訪問&#xff0c;那么在WebFlux中&#xff0c;靜態資源的訪問姿勢是否一致呢I. 默認配置與SpringBoot的默認配置一樣&#xff0c;WebFlux同樣是classpath:/META-INF/resources/,classpath:/resources/,classpath:/static/,classpath:/public/…

java中TreeSet集合如何實現元素的判重

1 /*2 看一下部分的TreeSet源碼....3 public class TreeSet<E> extends AbstractSet<E>4 implements NavigableSet<E>, Cloneable, java.io.Serializable5 {6 private transient NavigableMap<E,Object> m;7 //NavigableMap繼承SortedMap&…

php中改變函數路由,通過PHP重啟路由器以更換IP(原創)

在采集大批量數據時常常會觸發對方服務器的“自我保護”&#xff0c;請求過于頻繁就限制訪問。這時需要停留很長一段時間(十幾分鐘到幾十分鐘不等)才能恢復訪問&#xff0c;這樣采集數據的速度就受到非常大的限制。解決方法有兩個&#xff1a;1 通過圖片識別繞過驗證碼機制&…

axure 畫小程序效果圖_APP詳情頁如何用Axure畫出來

詳情頁是App原型中比較復雜的頁面類型&#xff0c;熟悉它的常用套路有助于快速畫出。之前的文章已經講解了APP常見功能中的頁面模板、下導航、上導航、列表頁怎么畫出來&#xff0c;請繼續關注浪子教你畫APP原型后續的其他功能模塊。APP詳情頁往往包含上導航&#xff0c;內容區…

HashSet中實現不插入重復的元素

/* 看一下部分的HashSet源碼.... public class HashSet<E>extends AbstractSet<E>implements Set<E>, Cloneable, java.io.Serializable {static final long serialVersionUID -5024744406713321676L;private transient HashMap<E,Object> map;privat…

tuxedo錯誤碼6_TUXEDE返回的所有錯誤代碼

TUXEDE返回的所有錯誤代碼tuxedo/include/atmi.h定于了TUXEDE返回的所有錯誤代碼。/** tperrno values - error codes* The man pages explain the context in which the following error codes* can return.*/#define TPMINVAL 0 /* minimum error message */#define TPEABORT…

java中finally和return的執行順序

注意&#xff1a;return的位置。。。從這幾個例子中可以看到&#xff0c;如果try之前沒有有條件的return&#xff0c;則try..catch..finally語句塊中的語句都是順序執行&#xff08;如果try中或者catch中 有return語句&#xff0c;那么先執行該return&#xff0c;然后執行final…

oracle如何設置權限,ORACLE的權限設置

創建用戶create user abc identified by 123;----------------------------------------------------授權grant create session,create table to abcgrant create sysdba to database----------------------------------------------------然后conn abc密碼&#xff1a;123----…

有關try..catch..finally處理異常的總結

//看一下下面的程序&#xff0c;你能正確的寫出不同的testEx2()方法時&#xff0c;程序的最終打印出來的數據嗎....先不要看下面的答案 public class ExceptionTest { public ExceptionTest() { } boolean testEx() throws Exception { boolean ret true; try { ret te…