昨天連續做了兩道網路流……這是第一道
這是道圖論題是肯定的,圖都給你了
那麼問題在於如何建模
問題要求訪問每個點恰好一次(我一開始沒看到這個條件……)
要求總時間最短,嘗試把問題轉化為一些經典圖論問題比如最短路
很可惜不行,那麼自然想到網路流(組裡面有句戲言叫「一切皆可網路流」,比如a+b……)
進一步分析發現單純的網路流是不行的,需要用費用流
訪問每個點恰好一次,跟路徑覆蓋其實有點像……
把每個星球拆成兩個點,u和u'
我們對每條題目給定的邊(u,v
),在網路流中加一條邊(u,v'
),流量為1,費用為時間
然後第一次可以前往任何乙個點,那麼從st向v'連一條邊,流量為1,費用為定位時間
從每個v'向ed連一條邊,容量為1,費用為0,表示每個點的的入度為1,僅會訪問一次
從st向每個u連一條邊,容量為1,費用為0,以便u通過(u,v'
)到達v'
那麼這個圖的最小費用流就是答案
至今只會寫ek版的費用流……速度超慢……傻×乙個……
//lib #include#include#include#include#include#include#include#include#include#includeusing namespace std; //macro #define rep(i,a,b) for(int i=a,tt=b;i<=tt;++i) #define drep(i,a,b) for(int i=a,tt=b;i>=tt;--i) #define erep(i,e,x) for(int i=x;i;i=e[i].next) #define irep(i,x) for(__typedef(x.begin()) i=x.begin();i!=x.end();i++) #define read() (strtol(ipos,&ipos,10)) #define sqr(x) ((x)*(x)) #define pb push_back #define ps system("pause"); typedef long long ll; typedef pairpii; const int oo=~0u>>1; const double inf=1e100; const double eps=1e-6; string name="", in=".in", out=".out"; //var struct e e[40008]; queueq; int n,m,st,ed,ans,tot=1; int h[1608],dis[1608],pre[1608],epre[1608]; bool vis[1608]; void add(int a,int b,int c,int d) void init() rep(i,1,m) } bool spfa() } return flag; } int flow() tmp=ed; while(tmp!=st) return ret*flow; } void work() int main()
SDOI2010 星際競速
10年一度的銀河系賽車大賽又要開始了。作為全銀河最盛大的活動之一,奪得這個專案的冠軍無疑是很多人的夢想,來自傑森座 星的悠悠也是其中之一。賽車大賽的賽場由n顆行星和m條雙向星際航路構成,其中每顆行星都有乙個不同的引力值。大賽要求車手們從一顆與這n顆行星之間沒有任何航路的天體出發,訪問這n顆行星每顆恰...
SDOI2010 星際競速
10年一度的銀河系賽車大賽又要開始了。作為全銀河最盛大的活動之一,奪得這個專案的冠軍無疑是很多人的夢想,來自傑森座 星的悠悠也是其中之一。賽車大賽的賽場由n顆行星和m條雙向星際航路構成,其中每顆行星都有乙個不同的引力值。大賽要求車手們從一顆與這n顆行星之間沒有任何航路的天體出發,訪問這n顆行星每顆恰...
SDOI2010 星際競速
題解 感覺非常智障。我還仔細看了一下題目這是不是顆樹,然後發現給了邊數 然後就沒往這想了 只能從小到大 顯然的dag性質啊。然後就很簡單了啊。考慮二分圖里最小路徑覆蓋 這題裡,其實也就是找一些路徑,使其覆蓋所有點 這題無非就是增加了費用限制 所以就變成跑最小費用最大流就好了 但是注意到飛躍到每個點是...