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次,問你路徑的最大權值和 其中有些邊可以無限制的走,但是它們...