洛谷P2770 航空路線問題(費用流)

2022-03-01 14:18:02 字數 1660 閱讀 6498

傳送門

完了這題好厲害……字串什麼的好麻煩……

要求從$1$到$n$的路徑,不重複,經過邊數最多

每乙個點拆成兩個,$a_i,b_i$,然後$a_i$到$b_i$連容量為$1$,費用為$1$的邊,保證每個點只被選一次

然後$1$和$n$的話要容量為$2$

然後有連邊的話,$b_i$向$a_j$連邊,容量$1$,費用$1$

要選的點最多,那麼就是要費用最大,所以跑乙個最大費用流

然後找方案的話,直接dfs,然後正著和倒著輸出

有幾個細節,寫在**裡了

1

//minamoto

2 #include3 #include4 #include5 #include6 #include7

#define inf 0x3f3f3f3f

8using

namespace

std;

9const

int n=5005,m=500005;10

int ver[m],next[m],head[n],edge[m],flow[m],tot=1;11

intdis[n],disf[n],pre[n],last[n],vis[n],maxflow,maxcost;

12int n,m,s,t;bool check=0

;13 queueq;

14 mapmp;

15string

name[n];

16 inline void add(int u,int v,int f,int

e)20

bool

spfa()32}

33}34return ~pre[t];35}

36void

dinic()44}

45}46int ans[1005];int num=0;47

void

out(int

u)55}56

}57intmain()

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

74 add(1,n+1,1,1),add(n,n+n,1,1

);75 s=1,t=n+n;

76dinic();

77if(!maxflow||(maxflow==1&&!check)) return puts("

no solution!

"),0;78

if(maxflow==1&&check)

79 printf("

%d\n

",maxcost/2-1

);80

//這裡的最多城市數是這個

81//

因為考慮如果邊連成乙個環,邊數等於點數

82//

然後每個點拆成兩個,除以二

83//

然後因為s'和t'被重複了兩次,減去1

84out

(s);

85for(int i=1;i<=num;++i) if(ans[i]<=n) cout<'\n'

;86 num=0;87

out(s);

88for(int i=num-2;i;--i) if(ans[i]<=n) cout<'\n'

;89//最後兩個肯定是t和t',不用管

90return0;

91 }

洛谷 P2770 航空路線問題

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

洛谷P2770 航空路線問題 最大費用最大流

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

P2770 航空路線問題(最大費用最大流)

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