2016 Multi-University Training Contest 1-1005---HDU 5727 Necklace(枚举+二分图匹配)
2016-07-21 10:46
721 查看
题目链接:HDU 5727
题意:有一些 宝石,分为阴阳两种,且数量相等,要串成一条项链,并且阴阳宝石不能相邻。同时,有一些阳宝石与特定的阴宝石相邻则会使得其变得暗淡无光。给出这些规则要求最少有多少个阳宝石会变得暗淡无光。
题解 :
其实就是一个阴阳宝石怎么交错摆放的问题,很容易想到通过DFS去搜索枚举,但是直接阴 阳交错搜索的话,时间复杂度太高。因此我们首先选取一种宝石(假设为阴),枚举所有的摆放情况,(最多(n-1)!=8!种)之后再依次枚举插入另一 种宝石(假设为阳),采用二分图匹配,如果在当前位置插入不会使得阳宝石变得暗淡,则建一条边。最后匈牙利跑一遍求出最大匹配,不能匹配的即为最少的暗淡宝石的数量。
代码:
题意:有一些 宝石,分为阴阳两种,且数量相等,要串成一条项链,并且阴阳宝石不能相邻。同时,有一些阳宝石与特定的阴宝石相邻则会使得其变得暗淡无光。给出这些规则要求最少有多少个阳宝石会变得暗淡无光。
题解 :
其实就是一个阴阳宝石怎么交错摆放的问题,很容易想到通过DFS去搜索枚举,但是直接阴 阳交错搜索的话,时间复杂度太高。因此我们首先选取一种宝石(假设为阴),枚举所有的摆放情况,(最多(n-1)!=8!种)之后再依次枚举插入另一 种宝石(假设为阳),采用二分图匹配,如果在当前位置插入不会使得阳宝石变得暗淡,则建一条边。最后匈牙利跑一遍求出最大匹配,不能匹配的即为最少的暗淡宝石的数量。
代码:
#include<iostream> #include<cstdio> #include<cstring> #include<algorithm> #include<queue> using namespace std; const int MAXN=9+5; const int INF=0x3f3f3f3f; int yes[MAXN][MAXN]; int g[MAXN][MAXN]; int boy[MAXN]; int link[MAXN]; int used[MAXN]; int n,m; int ans; bool dfs(int u) { for(int v=1;v<=n;v++) { if(g[u][v]&&!used[v]) { used[v]=1; if(link[v]==-1||dfs(link[v])) { link[v]=u; return 1; } } } return 0; } int hungray() { int res=0; memset(link,-1,sizeof(link)); for(int i=1;i<=n;i++) { memset(used,0,sizeof(used)); if(dfs(i)) res++; } return res; } int main() { //freopen("in.txt","r",stdin); //freopen("out.txt","w",stdout); while(scanf("%d%d",&n,&m)!=EOF) { if(n==0) { printf("0\n"); continue; } memset(yes,0,sizeof(yes)); for(int i=0;i<m;i++) { int a,b; scanf("%d%d",&a,&b); yes[a][b]=1; } ans=INF; for(int i=1;i<=n;i++) boy[i]=i; do { for(int i=1;i<=n;i++) { for(int j=1;j<=n;j++) { g[i][j]=0; if(j!=n&&!yes[i][boy[j]]&&!yes[i][boy[j+1]]) g[i][j]=1; if(j==n&&!yes[i][boy[j]]&&!yes[i][boy[1]]) g[i][j]=1; } } ans=min(ans,n-hungray()); }while(next_permutation(boy+2,boy+n+1)); printf("%d\n",ans); } return 0; }
相关文章推荐
- 初学图论-Kahn拓扑排序算法(Kahn's Topological Sort Algorithm)
- 初学图论-Bellman-Ford单源最短路径算法
- 初学图论-DAG单源最短路径算法
- 初学图论-Dijkstra单源最短路径算法
- 初学图论-Dijkstra单源最短路径算法基于优先级队列(Priority Queue)的实现
- 封装好的Folyd建图,C++源码
- LCA模板
- 图论学习笔记之一——Floyd算法
- 【LCA】SPOJ QTREE2
- poj 3249 Test for Job 最长路
- HDU 2544
- Timus 1557 Network Attack DFS+各种各种...
- HDU1289 Tarjan-模板题
- Poj2638 网络流+最短路+二分答案
- Aizu1311 分层图最短路 (...大概)
- HDU 3631 Shortest Path
- 根据图论构建可量化评估的产品设计模型-类图(Like Graph)
- 二分图匹配模板
- 最短路径 -- spfa
- POJ2377 Bad Cowtractors