網路流24題,最大匹配 騎士獨立問題

2021-08-20 21:26:45 字數 1699 閱讀 3485

話說這題和ssl-1144一模一樣,連資料範圍和樣例都一模一樣,不同的是洛谷的只有網路流能過,匈牙利會超時。。。

於是我便在洛谷上水了篇部落格,不知道過沒過。。。

其實這道題匈牙利也能過91分。。。但時間卻是網路流的4倍。。。

奇偶建圖(如果不這樣會tle更多的點),所以我們把奇數的點放在左邊,偶數的點放在右邊,若能攻擊到彼此,則將它們連邊,再求一邊匈牙利

在匈牙利演算法建模的基礎上在左右兩側分別加上源點和匯點,並將源點和所有的奇數點連邊,匯點和所有的偶數點連邊(容量都為1)

若能攻擊到彼此,則將它們連邊(容量為無窮大),再跑一遍最大流即可

#include

#include

#define n 202

#define m 20002

#define r(i,a,b) for(int i=a;i<=b;i++)

using

namespace

std;int n,m,ans,one,g[n][n],two,link[m],xq[m][2];

bool vis[m],ok[n][n];

const

short dx[8]=;

const

short dy[8]=;

int read()//輸入流

bool check(int x,int y)//判斷是否滿足要求

bool find(int x)

}return

false;

}int main()

}ans=n*n-m;

r(i,1,two)

printf("%d",ans);//輸出

}

#include

#include

#include

#define m 500001//這個一定要開得足夠大

#define k(i,j) (i-1)*n+j//用這個表示每個點的標號

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

using

namespace

std;int id,f,n,m,d[m],l[m],s,t,sum,a;char c;

bool ok[201][201];

int read()

struct nodee[m];int tot;

const

short dx[8]=;

const

short dy[8]=;//八個方向

void add(int u,int v,int w)//建邊

bool bfs()//分層圖建設}}

return

false;

}int dfs(int x,int flow)//尋找可行流

}if(!rest) d[x]=-1;

return rest;

}int dinic()

int main()

} else add(k(i,j),t,1);//連邊

}printf("%d",sum-dinic());//輸出

}

記得在學最大流的時候,老師跟我們說讓我們用網路流去做最大匹配的題,當時我還有點不解,做了這道題後算是有了乙個比較深入的了解吧。

網路流24題的其他題貌似也有許多可以用匈牙利演算法做,不明白為什麼會被評為省選/noi-。。。

網路流24題 騎士共存

輸入檔案 knight.in輸出檔案 knight.out簡單對比 時間限制 1 s 記憶體限制 128 mb 騎士共存問題 問題描述 在乙個n n個方格的西洋棋棋盤上,馬 騎士 可以攻擊的棋盤方格如圖所示。棋盤 上某些方格設定了障礙,騎士不得進入。程式設計任務 對於給定的n n個方格的西洋棋棋盤和...

網路流24題 騎士共存問題(最大流)

cogs 這題本質上和方格取數問題沒有任何區別 首先也是可以黑白染色 因為馬必定會跳到異色點上面去 然後同樣的,源點向一種顏色,另一種顏色向匯點連邊 因為代價就是1,所以容量都是1 這裡考慮的 相鄰 的情況是馬的跳法 因此,列舉從當前點能夠到達的位置,連一條容量為inf的邊過去 障礙直接特殊考慮就行...

網路流24題24 騎士共存問題

題面戳我 題目描述 在乙個 nn個方格的西洋棋棋盤上,馬 騎士 可以攻擊的棋盤方格如圖所示。棋盤上某些方格設定了障礙,騎士不得進入 對於給定的 nn 個方格的西洋棋棋盤和障礙標誌,計算棋盤上最多可以放置多少個騎士,使得它們彼此互不攻擊 輸入輸出格式 輸入格式 第一行有 2 個正整數n 和 m 1 n...