程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> C語言 >> C++ >> C++入門知識 >> HDU 3118 Arbiter 判定奇圈

HDU 3118 Arbiter 判定奇圈

編輯:C++入門知識

題目來源:HDU 3118 Arbiter

題意:翻譯過來就是不能有奇圈 每走一步狀態會變化 當他回到起點時如果和原來的狀態不一樣 可能會死 求至少去掉多少條邊可以避免這種狀況發生

思路:二分圖是沒有奇圈的 最多就15個點 我們用狀態壓縮枚舉那些點是在二分圖的一邊和另外一邊 確定二分圖之後枚舉輸入的邊 每條邊連接的不能是同一集合的點

不符合就去掉 最後取小

#include 
#include 
#include 
#include 
#include 
using namespace std;
const int maxn = 510;
struct node
{
	int t1, t2, x1, y1, x2, y2;
}a[maxn];
int vis[maxn];
int y[maxn];
vector  G[maxn];
int n;

int color[maxn];
int sum = 0;

bool dfs(int u)
{
	for(int i = 0; i < G[u].size(); i++)
	{
		int v = G[u][i];
		if(vis[v])
			continue;
		vis[v] = true;
		if(y[v] == -1 || dfs(y[v]))
		{
			y[v] = u;
			return true;
		}
	}
	return false;
}
int match()
{
	int ans = 0;
	memset(y, -1, sizeof(y));
	for(int i = 0; i < n; i++)
	{
		memset(vis, 0, sizeof(vis));
		if(dfs(i))
			ans++;
	}
	return ans;
}
int main()
{
	int T;
	scanf("%d", &T);
	while(T--)
	{
		int m;
		scanf("%d %d", &n, &m);
		for(int i = 0; i < n; i++)
			G[i].clear();
		while(m--)
		{
			int u, v;
			scanf("%d %d", &u, &v);
			G[u].push_back(v);
			//G[v].push_back(u);
		}
		int ans = 999999999;
		for(int s = 0; s < (1<

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved