用最少的路徑覆蓋所有的邊

2021-08-22 02:43:43 字數 1230 閱讀 2449

最小流做法如下:

建出可行流的模型,設原先的源匯為ss和tt,新加入的源匯為s和t

跑可行流,若s的某條出邊不滿流則無解

刪除s和t的所有連邊,設tt−ss這條邊的流量為x1,刪除這條邊

鏈結s−>tt和ss−>t,跑最大流,設最大流為x2

那麼x1−x2即為最小流

原理是跑可行流的時候可能多跑了一些,第二次最大流是為了將多跑的這些跑回來

注意:最小路徑覆蓋是 在乙個有向圖中,找出最少的路徑,使得這些路徑經過了所有的點。

#includeusing namespace std;

const int maxn=30000;

struct node

edge[maxn*3];

int in[maxn];

queueq;

int s,t;

int cnt=0,head[maxn];

const int inf=0x3f3f3f3f;

int dis[maxn];

void add_edge(int u,int v,int w)

int bfs()}}

return 0;

}int dfs(int x,int low)

}return low-temp;

}int main ()

} add_edge(n+1,0,inf);

int tmppid=cnt;

add_edge(0,n+1,0);

s=n+2;

t=n+3;

for(int i=1;i<=n;i++)

if(in[i]<0)

}while(bfs())

dfs(s,inf);

for(int i=head[s];i!=-1;i=edge[i].nxt)

for(int i=head[t];i!=-1;i=edge[i].nxt)

int ans=edge[tmppid].w;

edge[tmppid].w=edge[tmppid^1].w=0;

add_edge(s,n+1,inf);

add_edge(n+1,s,0);

add_edge(0,t,inf);

add_edge(t,0,0);

while(bfs())

ans-=dfs(s,inf);

printf("%d\n",ans);

}

用Python遍歷某路徑下的所有檔案

os.walk 會返回三元元組 dirpath,dirnames,filenames dirpath 根路徑 字串 dirnames 路徑下的所有目錄名 列表 filenames 路徑下的所有非目錄檔名 列表 其中目錄名和檔名都是沒有加上根路徑的,所以需要完整路徑時需要將目錄名或檔名與根路徑連線起來...

c 獲取路徑的碟符 C 獲取本地電腦所有的碟符

c 獲取本地電腦所有的碟符 話不多說,直接上菜 public list getremovabledeviceid list deviceids new list managementobjectsearcher query new managementobjectsearcher select fr...

用棧求解迷宮問題的所有路徑及最短路徑程式

目的 掌握棧在求解迷宮問題中的應用。內容 編寫乙個程式,輸出迷宮的所有路徑,並求第一條最短路徑長度及最短路徑。如下 include include include include using namespace std define inf 0x3f3f3f const int maxsize 10...