有向非循環圖的最小路徑覆蓋 二分圖模型解題

來源:互聯網
上載者:User

標籤:style   blog   http   color   io   os   ar   for   資料   

  
  有向非循環圖中,路徑覆蓋就是在圖中找一些路徑,使之覆蓋了圖中的所有頂點,且任何一個頂點有且只有一條路徑與之關聯(如果把這些路徑中的每條路徑從它的起始點走到它的終點,那麼恰好可以經過圖中的每個頂點一次且僅一次)。
  最小路徑覆蓋就是找出最小的路徑條數,使之成為原圖的一個路徑覆蓋。

  公式:最小路徑覆蓋=(原圖)頂點數-對應的二分圖的最大匹配數。

  我們通過例題來解釋如何把DAG轉換為二分圖模型。

  HDU1151 Air Raid

  題目大意:在一個城鎮,有n個路口,和m條單向路,而且這些路不會形成環。現在要弄一些傘兵去巡查這個城鎮,傘兵只能沿著路的方向走,問最少需要多少傘兵才能把所有的路口搜一遍。

  從題目的描述中就能看出這是求最小路徑覆蓋。

看第一組測試資料:

4
3
3 4
1 3
2 3

我們把每個點都拆成兩個點,代表著這個點的出度,也有入度。那麼拆點後一個點就變為了兩個點x和x‘,所有的點就構成了X、Y兩個集合。可以發現x是只能邊的起點,x‘邊的終點,那麼求最大匹配與原圖求沒有相交的路徑數就變為一樣的了。(為什麼就變成一樣的?)

 

 

圖片示範了如何轉化為二分圖模型。(圖片哪來的?《圖論及應用》,哈爾濱工業大學出版的)

下面是代碼:

 1 #include<iostream> 2 #include<cstdio> 3 #include<cstring> 4 #include<algorithm> 5 #include<queue> 6 using namespace std; 7  8 const int N=1005,INF=0x3f3f3f3f; 9 int bmap[N][N],cx[N],cy[N],dx[N],dy[N];10 bool bmask[N];11 int nx,ny,dis,ans;12 bool searchpath()13 {14     queue<int> q;15     dis=INF;16     memset(dx,-1,sizeof(dx));17     memset(dy,-1,sizeof(dy));18     for(int i=1;i<=nx;i++)19     {20         if(cx[i]==-1){ q.push(i); dx[i]=0; }21         while(!q.empty())22         {23             int u=q.front(); q.pop();24             if(dx[u]>dis) break;25             for(int v=1;v<=ny;v++)26             {27                 if(bmap[u][v]&&dy[v]==-1)28                 {29                     dy[v]= dx[u] + 1;30                     if(cy[v]==-1) dis=dy[v];31                     else32                     {33                         dx[cy[v]]= dy[v]+1;34                         q.push(cy[v]);35                     }36                 }37             }38         }39     }40     return dis!=INF;41 }42 int findpath(int u)43 {44     for(int v=1;v<=ny;v++)45     {46         if(!bmask[v]&&bmap[u][v]&&dy[v]==dx[u]+1)47         {48             bmask[v]=1;49             if(cy[v]!=-1&&dy[v]==dis) continue;50             if(cy[v]==-1||findpath(cy[v]))51             {52                 cy[v]=u; cx[u]=v;53                 return 1;54             }55         }56     }57     return 0;58 }59 void maxmatch()60 {61     ans=0;62     memset(cx,-1,sizeof(cx));63     memset(cy,-1,sizeof(cy));64     while(searchpath())65     {66         memset(bmask,0,sizeof(bmask));67         for(int i=1;i<=nx;i++)68             if(cx[i]==-1) ans+=findpath(i);69     }70 }71 void init()72 {73     memset(bmap,0,sizeof(bmap));74 }75 int main()76 {77     //freopen("test.txt","r",stdin);78     int n,m,i,j,k,cas;79     scanf("%d",&cas);80     while(cas--)81     {82         scanf("%d%d",&n,&m);83         init();84         while(m--)85         {86             scanf("%d%d",&i,&j);87             bmap[i][j]=1;88         }89         nx=ny=n;90         maxmatch();91         printf("%d\n",n-ans);92     }93     return 0;94 }
View Code

 

有向非循環圖的最小路徑覆蓋 二分圖模型解題

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.