訓練指南 網路流題集

2022-05-08 17:57:22 字數 3114 閱讀 5699

layout: post

title: 訓練指南 網路流題集

author: "luowentaoaa"

catalog: true

mathjax: true

tags:

- 網路流

- 圖論

- 訓練指南

uva - 11248 frequency hopping

給定乙個有向網路,每條邊均有乙個容量。問是否存在乙個從點1到點n,流量為c的流。如果不存在,是否可以恰好修改一條弧的容量,使得存在這樣的流。

先求一遍最大流,如果大於等於c,那麼就直接輸出possible。

否則的話就是最大流達不到c,那麼對哪些邊進行擴容呢,肯定是選擇最小割!

將最小割的邊集全部求出來,之後每條邊都嘗試將容量變為c,看看能否達到要求。

優化一:求完最大流後把流量留著,以後每次在它的基礎上增廣。

優化二:每次沒必要求出最大流,增廣到流量至少為c時就可以停下來。

搞不到為什麼劉汝佳**那麼快

#includeusing namespace std;

typedef long long ll;

const ll mod=998244353;

const int maxn=1e6+50;

const ll inf=0x3f3f3f3f3f3f3f3fll;

struct edge

bool operator<(const edge& a)const}}

return vis[t];

}int dfs(int x,int a)

}return flow;

}int maxflow(int s,int t)

return flow;

}vectormincut()

return ans;

}void reduce()

if(ans.empty())printf("not possible\n");

else}}

return 0;

}

有 n 個隊伍進行比賽,每個隊伍比賽數目是一樣的,每場恰好乙個勝乙個負,給定每個隊伍當前勝的場數敗的數目,以及兩個隊伍剩下的比賽場數,問你冠軍隊伍可能是哪些隊。

對每個隊伍 i 進行判斷是不是能冠軍,最優的情況的就是剩下的比賽全都勝,也就是一共勝的數目就是剩下的要比賽的數再加上原來勝的數目sum,然後把每兩個隊伍比賽看成乙個結點,(u, v),然後從 s 向 結點加一條容量要打的比賽數目的容量,然後從 (u, v) 向 u 和 v 分別加一條容量為無窮大的邊,然後每個 u 向 t 加一條容量為 sum - w[i] ,跑乙個最大流,如果是滿流是,那麼就是有解,也就是 i 可能是冠軍。

#includeusing namespace std;

typedef long long ll;

const ll mod=998244353;

const int maxn=700+50;

const ll inf=0x3f3f3f3f3f3f3f3fll;

struct edge

bool operator<(const edge& a)const}}

return vis[t];

}int dfs(int x,int a)

}return flow;

}int maxflow(int s,int t)

return flow;

}}g;const int maxt=25+5;

int n,w[maxt],d[maxt],a[maxt][maxt];

inline int id(int u,int v)

inline int id(int u)

bool canwin(int team)

if(w[u]>t;

while(t--)

bool operator<(const edge& a)const}}

return vis[t];

}int dfs(int x,int a)

}return flow;

}int maxflow(int s,int t)

return flow;

}}g;const int maxt=30+5;

int n,w[maxt],d[maxt],a[maxt][maxt],m;

inline int id(int u)///物品

inline int pid(int u)

int s,t;

void build()

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

else if(!a[i][j])}}

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

}int main()

}s=0,t=n+m+1;

build();

cout<<"case #"建邊的時候,費用我用的是相反數,所以得到最小費用後要去相反數

mcmf的時候,用乙個陣列紀錄了到達匯點時所花費的最小價值,因為取的是相反數,所以當價值為正時,就表示已經虧本了,所以可以退出了

#includeusing namespace std;

typedef long long ll;

const ll mod=998244353;

const int maxn=700+50;

const ll inf=0x3f3f3f3f3f3f3f3fll;

struct edge

};struct mcmf}}

}if(d[t]>0)return false;

flow+=a[t];

cost+=(ll)d[t]*(ll)a[t];

for(int u=t;u!=s;u=edges[p[u]].from)

return true;

}int mincostmaxflow(int s,int t,ll& cost)

}g;int main()

}ll cost=0;g.mincostmaxflow(source,sink,cost);

cout<<"case "<}

return 0;

}

藍橋杯演算法訓練 網路流裸題

問題描述 乙個有向圖,求1到n的最大流 輸入格式 第一行n m,表示點數與邊數 接下來m行每行s t c表示一條從s到t的容量為c的邊 輸出格式 乙個數最大流量 樣例輸入 6 10 1 2 4 1 3 8 2 3 4 2 4 4 2 5 1 3 4 2 3 5 2 4 6 7 5 4 6 5 6 3...

網路流訓練總結

1.表達圖中點的互斥關係 當我們在解題時,需要取某些點,但是取完這些點後,有些點就不能取了,即點與點之間存在互斥關係。但是網路流中連邊似乎只有關聯的關係,沒有這種互斥關係。其實我們可以讓互斥的點連邊,流量為無窮大。我們嘗試用最小割分割他們,最小割後,圖不再連通,那麼這條邊永遠不會被走到,即永遠不會發...

網路流24題 最長k可重區間集(費用流)

cogs loj洛谷 首先注意一下 這道題目裡面 在cogs上直接做就行了 洛谷和loj上需要判斷資料合法,如果 l r 就要交換l,r 首先離散化 資料範圍比較大 記錄一下l,r 和區間大小 這個問題可以換一種看法 相當於從源點出發,走k次,問你路徑的最大權值和 其中有些邊可以無限制的走,但是它們...