日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

hdu3313 最大流找关键点,或者最短路找关键点.

發(fā)布時間:2025/6/17 编程问答 20 豆豆
生活随笔 收集整理的這篇文章主要介紹了 hdu3313 最大流找关键点,或者最短路找关键点. 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
題意:
? ? ?給你一個有向圖,然后給你起點和終點,問你從起點到終點有多少個關鍵點,如果當前的這個點刪除了就無法從起點到終點,那么這個點就是一個關鍵點..


思路:
? ? ?(1)有兩種做法,我用的是最大流的,另一種是先跑最短路然后搜索,先說最大流,最大流的很容易理解,首先我們拆點建圖,每個點拆成兩個點,限流是1,然后起點和終點的限流是2,點于點之間是INF,跑一遍最大流,如果流量是0,說明不連接,那么所有的點都是關鍵點,輸出n,如果流量是2那么說明最小割是2,也就是說無論你把那個點刪除都不影響連通性,所以只有起點和終點是關鍵點,如果流量是1,那也就是說在路途中可能存在關鍵點,那么我們就

用暴力搜索的方式去找這些關鍵點,對于搜索這塊我自己卡了兩天了,今天才弄明白,首先我們定義跑完最大流后流量為0的邊為關鍵邊,首先第一個點一定是關鍵點,我們一個一個找,我的理解是 從當前的這個關鍵點出發(fā),通過非關鍵邊搜索,第一個搜索不到的點一定是關鍵點,這里的搜索不到的點指的是我們比如當前邊u,v,他沿著非關鍵邊無法從u走到v,但是沿著關鍵邊可以走到,那么v就是第一個搜不到的點,v一定是關鍵點,跑完最大流后,流量0(正向)的是關鍵路徑上的點,非0的是非關鍵路徑上的點,我們每次從當前的關鍵點出發(fā),沿著流量非0的跑,把這次跑到的點全記錄下來,mark上,然后枚舉每一個搜到的點相鄰的點,如果是流量0,那么這個就是第一個到達不了的點,那么他一定是關鍵點,這屆break,以這個點為起點在接著搜索,就這樣一直找到T為止.還有為什么上面有兩條邊是2而不是別的,是為了縮短時間,2最多兩次,我們是為了找到答案是0,1,還是其他,2.3.4..都是其他,都是只存在兩個關鍵點的,所以我們要節(jié)省時間,流量2,如果弄大了答案肯定對,但會TLE...

最大流已知當前點找下一個關鍵點的搜索過程,紅色是搜索路徑,當前點a,下一個關鍵點是c,
則如圖:




#pragma comment(linker, "/STACK:1024000000,1024000000")#include<stdio.h> #include<string.h> #include<queue>#define N_node 200000 + 20 #define N_edge 600000 + 60 #define INF 1000000000 using namespace std;typedef struct {int to ,cost ,next; }STAR;typedef struct {int x ,t; }DEP;STAR E[N_edge]; DEP xin ,tou; int list[N_node] ,tot; int deep[N_node] ,list2[N_node]; int mark[N_node] ,num[N_node] ,tt;void add(int a, int b ,int c) {E[++tot].to = b;E[tot].cost = c;E[tot].next = list[a];list[a] = tot;E[++tot].to = a;E[tot].cost = 0;E[tot].next = list[b];list[b] = tot; }int minn(int x ,int y) {return x < y ? x : y; }bool BFS(int s ,int t ,int n) {memset(deep ,255 ,sizeof(deep));deep[s] = 0;xin.x = s;xin.t = 0;queue<DEP>q;q.push(xin);while(!q.empty()){tou = q.front();q.pop();for(int k = list[tou.x] ;k ;k = E[k].next){xin.x = E[k].to;xin.t = tou.t + 1;if(deep[xin.x] != -1 || !E[k].cost)continue;deep[xin.x] = xin.t;q.push(xin);}}for(int i = 0 ;i <= n ;i ++)list2[i] = list[i];return deep[t] != -1; }int DFS_FLOW(int s ,int t ,int flow) {if(s == t) return flow;int nowflow = 0;for(int k = list2[s] ;k; k = E[k].next){list2[s] = k;int to = E[k].to;int cost = E[k].cost;if(deep[to] != deep[s] + 1 || !cost) continue;int tmp = DFS_FLOW(to ,t ,minn(cost ,flow - nowflow));nowflow += tmp;E[k].cost -= tmp;E[k^1].cost += tmp;if(flow == nowflow)break;}if(!nowflow) list2[s] = 0;return nowflow; }int DINIC(int s ,int t ,int n) {int sum = 0;while(BFS(s ,t ,n)){ sum += DFS_FLOW(s ,t ,INF);}return sum; }void dfs(int s) {mark[s] = 1;num[++tt] = s;for(int k = list[s] ;k ;k = E[k].next){int to = E[k].to;if(E[k].cost && !mark[to])dfs(to);} }int find(int n ,int S ,int T) {E[list[S]].cost = 0;E[list[T - n]].cost= 0;int cout = 0;memset(mark ,0 ,sizeof(mark));while(1){ tt = 0;dfs(S);int ok = 1;for(int i = 1 ;i <= tt && ok ;i ++){ for(int k = list[num[i]] ;k && ok ;k = E[k].next)if(k % 2 == 0 && !mark[E[k].to] && !E[k].cost){ok = 0;S = E[k].to;cout ++;if(E[k].to == T)return cout;}}} }int main () {int n ,m ,S ,T ,i ,j ,a ,b ,c;while(~scanf("%d %d" ,&n ,&m)){memset(list ,0 ,sizeof(list));tot = 1;for(i = 1 ;i <= m ;i ++){scanf("%d %d" ,&a ,&b);add(a + n + 1,b + 1, INF);}scanf("%d %d" ,&S ,&T);S ++ ,T ++;for(i = 1 ;i <= n ;i ++){if(i != S && i != T)add(i ,i + n ,1);else add(i ,i + n ,2);}T += n;int flow = DINIC(S ,T ,n + n);if(flow == 0) printf("%d\n" ,n);else if(flow == 2) puts("2");else printf("%d\n" ,find(n ,S ,T));}return 0; } 思路:(2)最短路,先跑一個最短路,記錄路徑,如果到不了T,那么就輸出n,如果能的話,來一個深搜,看看只跑非最短路上的點能不能到達T,如果能,那么就說明至少存在兩條不相交的路,那么直接輸出2,否則就是存在關鍵點的情況了,枚舉每一個關鍵點,通過非最短路上的點找到里關鍵點最遠的那個最短路上的點,那么這個點一定是關鍵點,然后在吧當前的這個點當下一步的關鍵點,就這樣一直找到T就行了..比最大流的那個好寫,思路都差不多.. 當前點a的下一個關鍵路徑是c,是最遠的那一個,如圖. #include<stdio.h> #include<string.h> #include<queue>#define N_node 110000 #define N_edge 330000 #define INF 1000000000 using namespace std;typedef struct {int to ,next ,cost; }STAR;STAR E[N_edge]; int list[N_node] ,tot; int mer[N_node] ,S ,T; int s_x[N_node] ,mk_sx[N_node]; int mark[N_node];void add(int a ,int b ,int c) {E[++tot].to = b;E[tot].cost = c;E[tot].next = list[a];list[a] = tot; }bool SPFA(int s ,int t ,int n) {memset(mark ,0 ,sizeof(mark));for(int i = 0 ;i <= n ;i ++){s_x[i] = INF;mer[i] = i;}s_x[s] = 0;mark[s] = 1;queue<int>q;q.push(s);while(!q.empty()){int xin ,tou;tou = q.front();q.pop();mark[tou] = 0;for(int k = list[tou] ;k ;k = E[k].next){xin = E[k].to;if(s_x[xin] > s_x[tou] + E[k].cost){s_x[xin] = s_x[tou] + E[k].cost;mer[xin] = tou;if(!mark[xin]){mark[xin] = 1;q.push(xin);}}}}return s_x[t] != INF; }int ok; void DFS_1(int s) {for(int k = list[s] ;k ;k = E[k].next){int to = E[k].to;if(mark[to]|| ok) continue;if(to == T) ok = 1;if(mk_sx[to] || ok) continue;mark[to] = 1;DFS_1(to);} }int mk_id ,maxx; void DFS_2(int s) {for(int k = list[s] ;k ;k = E[k].next){int to = E[k].to;if(mark[to]) continue;if(mk_sx[to]){if(maxx < s_x[to]){maxx = s_x[to];mk_id = to;}continue ;}mark[to] = 1;DFS_2(to);} }int main () {int n ,m ,i ,j;int a ,b;while(~scanf("%d %d" ,&n ,&m)){memset(list ,0 ,sizeof(list));tot = 1;for(i = 1 ;i <= m ;i ++){scanf("%d %d" ,&a ,&b);add(a + 1 ,b + 1 ,1);}scanf("%d %d" ,&S ,&T);S ++ ,T ++;if(!SPFA(S ,T ,n)){printf("%d\n" ,n);continue;}memset(mk_sx ,0 ,sizeof(mk_sx));int now = T;while(mer[now] != now){mk_sx[now] = 1;now = mer[now];}mk_sx[now] = 1;ok = 0;memset(mark ,0 ,sizeof(mark));mark[S] = 1;DFS_1(S);if(ok){puts("2");continue;}int sum = 1; memset(mark ,0 ,sizeof(mark));while(1){//mk_id ,maxx maxx = 0;mark[S] = 1;DFS_2(S);sum ++;S = mk_id;//printf("%d***\n" ,S); if(S == T) break;}printf("%d\n" ,sum);}return 0; }

總結

以上是生活随笔為你收集整理的hdu3313 最大流找关键点,或者最短路找关键点.的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。

主站蜘蛛池模板: 713电影免费播放国语 | 蜜臀av性久久久久蜜臀aⅴ涩爱 | 色香蕉av| 亚洲污污视频 | 九色porny丨精品自拍视频 | 亚洲欧美91 | 国产视频福利在线观看 | 韩国bj大尺度vip福利网站 | 狠狠干伊人网 | 午夜骚影| 色哟哟免费在线观看 | 丝袜人妻一区二区 | 久草一区 | 黄视频网站在线 | 国产一级二级视频 | juliaann欧美二区三区 | 青青青在线视频观看 | 日日草天天干 | 久久久国产精品无码 | 黄色福利视频网站 | 色哟哟在线视频 | 日韩最新网址 | 不卡的一区二区 | 麻豆导航 | 清冷学长被爆c躁到高潮失禁 | 欧美日韩一级二级 | 99久久久无码国产精品性 | 日韩一级片中文字幕 | 日本中文字幕在线视频 | 日本a区 | 91福利专区 | 97人妻人人揉人人躁人人 | 色狠av | 亚洲精品久久久中文字幕痴女 | 国产视频在 | 国产午夜精品在线 | 日本免费三级网站 | 久久久99精品免费观看 | 日韩精品黄| 国产强被迫伦姧在线观看无码 | 四虎音影 | 中国无码人妻丰满熟妇啪啪软件 | 国产超碰在线 | 成人免费a视频 | 国产日韩欧美一二三区 | 乱色精品无码一区二区国产盗 | 国产农村妇女精品久久久 | 漂亮人妻被黑人久久精品 | 超碰123 | 特级a毛片| h视频免费在线 | 成人毛片100部免费看 | 特黄特色大片免费 | 国产真人真事毛片 | 久久久视 | 久久久久久亚洲中文字幕无码 | 男女做那个的全过程 | 国产国语老龄妇女a片 | 国产午夜精品久久久久久久 | 欧美成人aa | 三叶草欧洲码在线 | 精品国产一区二区三区日日嗨 | 51久久久 | 亚洲熟妇无码乱子av电影 | 影音先锋中文在线 | 国产爱搞 | 中文字幕18页| 在线观看日本一区 | 韩国久久久久久 | 国产丝袜美女 | 91精品啪在线观看国产 | 免费h片在线观看 | 国产一区二区高清视频 | 亚洲视频久久久 | 人与禽一级全黄 | 91精品国产乱码 | 激情欧美一区二区免费视频 | 一级黄色特级片 | 激情内射亚洲一区二区三区爱妻 | 中文在线а√在线 | 久草视频在线免费 | 欧美日韩亚洲免费 | 国产亚洲精 | 综合性色 | 伊人久久国产精品 | 日韩一级一级 | 欧美一级黑人 | 日韩一区二区在线观看视频 | 久久蜜桃av | 男女无遮挡网站 | 国产裸体美女永久免费无遮挡 | 极品销魂美女少妇尤物 | 张柏芝54张无删码视频 | 青青草www | 日韩欧美中文 | 特黄av| 精品国产一区二区三区久久久 | 麻豆视频在线免费看 | 亚洲视频免费观看 |