luogu P2770 航空路線問題

2022-02-05 07:22:56 字數 1236 閱讀 5943

傳送門

題意是選出兩條從左往右的中間點不能重複選的路徑,並使得經過的所有點數最大

可以考慮最大費用最大流,即把所有點拆點,入點向出點中間連容量為1,費用為1的邊,然後按照題目中的關係把左邊點的出點和右邊點的入點連容量為1,費用為0的邊(起點和終點的中間邊容量為2);源點到起點,終點到匯點連容量為2,費用為0的邊

輸出方案就反向從匯點找增廣路,記錄路徑即可

// luogu-judger-enable-o2

#include#define ll long long

#define il inline

#define re register

#define max(a,b) ((a)>(b)?(a):(b))

#define min(a,b) ((a)<(b)?(a):(b))

#define inf 1061109567

using namespace std;

const int n=200+10,m=5000+10;

il ll rd()

while(ch>='0'&&ch<='9')

return x*w;

}int to[m<<1],nt[m<<1],hd[n],tot=1;

int c[m<<1],w[m<<1];

il void add(int x,int y,int z,int zz)

int n,m,ss,tt,ans,ff;

int pr[n],di[n],fl[n];

bool v[n];

il bool fyl()

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

for(int i=2;ix) continue;

x=to[i],pr[to[i]]=i;

break;

}if((x&1)&&x>1) an.push_back(x>>1);

}while(x!=tt)

int len=an.size();

for(int i=0;ix) continue;

x=to[i],pr[to[i]]=i;

break;

}if((x&1)&&x>1) an.push_back(x>>1);

}/*while(x!=tt)

*///這部分在題目中沒用,就注釋掉了

len=an.size();

for(int i=0;ireturn 0;

}

luogu2770 航空路線問題

前置技能 hdu3376 matrix again 所以看到這個題,我們也會想著用最大費用最大流解決,因為從起點飛到終點再飛回來,就等於從起點飛兩次到終點且這兩次飛行除了起點終點之外沒有訪問超過一次的點。考慮拆點限流,除起點終點以外的點容量是1 花費代表邊權 起點終點容量是2。輸出方案的話,我是df...

洛谷 P2770 航空路線問題

給定一張航空圖,圖中頂點代表城市,邊代表 2 城市間的直通航線。現要求找出一條滿足下述限制條件的且途經城市最多的旅行路線。1 從最西端城市出發,單向從西向東途經若干城市到達最東端城市,然後再單向從東向西飛回起點 可途經若干城市 2 除起點城市外,任何城市只能訪問 1 次。對於給定的航空圖,試設計乙個...

luogu2770 航空路線問題 網路流

題目大意 給定一張航空圖,圖中頂點代表城市,邊代表 2 城市間的直通航線。現要求找出一條滿足下述限制條件的且途經城市最多的旅行路線。1 從最西端城市出發,單向從西向東途經若干城市到達最東端城市,然後再單向從東向西飛回起點 可途經若干城市 2 除起點城市外,任何城市只能訪問 1 次。關鍵字 網路流 方...