LA 4593 给一个无向图 让每一条边有方向 使得这个图无环 且最长链最短
2017-07-26 10:56
309 查看
#include<cstdio> #include<cstring> #define INF 0x3f3f3f3f using namespace std; int dp[1<<15],vis[1<<15],path[1<<15]; char str[160][6]; int dfs(int s) { if(dp[s]!=-1) return dp[s]; int t=(1<<15)-s-1; dp[s]=INF; for(int i=t;i;i=(i-1)&t) { if(vis[i]) continue; if(dp[s]>dfs(s+i)+1) { dp[s]=dp[s+i]+1; path[s]=s+i; } } return dp[s]; } int main() { int n; while(~scanf("%d",&n)) { memset(vis,0,sizeof(vis)); for(int i=0;i<n;i++) { char c1[6],c2[6]; scanf("%s%s",c1,c2); str[i][0]=c1[0]; str[i][1]=c2[0]; int s=(1<<(c1[0]-'L'))|(1<<(c2[0]-'L')); for(int i=0;i<(1<<15);i++) { if((i&s)==s) vis[i]=1; } } memset(dp,-1,sizeof(dp)); dp[(1<<15)-1]=0; printf("%d\n",dfs(0)-2); int d[20],lo=0,t=0; while(lo!=(1<<15)-1) { int x=path[lo]-lo; for(int i=0;i<15;i++) if(x&(1<<i)) d[i]=t; t++; lo=path[lo]; } for(int i=0;i<n;i++) { int a=str[i][0]-'L'; int b=str[i][1]-'L'; if(d[a]>d[b]) printf("%c %c\n",str[i][0],str[i][1]); else printf("%c %c\n",str[i][1],str[i][0]); } } }
相关文章推荐
- 给你一个 n 个点,m 条边的无向图,求至少要在这个的基础上加多少条无向边使得任意两个点可达~
- hdu 3551 Hard Problem 一般图最大匹配+给出一个无向图,存在重边,没有自环。问能否删除一些边,使得每个顶点的度数为指定度数
- 给定一个由整数组成二维矩阵(r*c),现在需要找出它的一个子矩阵,使得这个子矩阵内的所有元素之和最大,并把这个子矩阵称为最大子矩阵。
- Codeforces Beta Round #89 (Div. 2)E题,给一联通的无向图,求确定每边的方向,使得任意两点可达
- 给定一个数组,当中有正负数,求当中的一段“子数组”(即任意长度,连续的数字), 使得这个“子数组”的和是所有“子数组”和中最大的
- Poj 2482 Stars in Your Window(用W*H的矩形去围住一个区域,使得这个区域内的星星的亮度最大)
- 请一个在字符串中找出连续最长的数字串,并把这个串的长度返回;如果存在长度相同的连续数字串,返回最后一个连续数字串
- CF209 Div2 (D) 找最长的连续子序列拥有相同的最大公约数,并且最大公约数是这个序列中的一个数-------左右延伸的方法
- 这次带来的小程序是:确定一个字符串有多少个单词,然后最长单词和最短单词有哪些
- 请设计一个算法,给一个字符串进行二进制编码,使得编码后字符串的长度最短。
- 【省选模拟试题】排水系统 dijkstra+最短路径树+优先队列维护(当然这个和dij的不是同一个)
- 【微软100题】写一个函数,它的原形是int continumax(char *outputstr,char *intputstr) 功能: 在字符串中找出连续最长的数字串,并把这个串的长度返回
- 给定一个字符串a,你可以从中删除一些字符,使得剩下的串是一个回文串。如何删除才能使得回文串最长? 输出需要删除的字符个数。
- UVA 1399 Puzzle 求一个最长的串使得该串不包含任何禁止串为子串 AC自动机 + DP +dfs判环
- 2014年去哪儿网笔试题--给定一个整型数组,对这个整型素组排序,使得按序拼接数组各元素得到的值最小
- 给一个字符串,在后边最短添加什么,才能使得整体变成回文串
- 一个无序整数数组中找到最长连续序列(Longest Consecutive Sequence)和两个元素使得相差最小
- ZOJ1037 题目大意就是 计算在这个国家中所有城市的旅行售货员问题的最短长度,每个城市位于矩形网格的点上,方向有八个,单位长度为1
- 2014年去哪儿网笔试题--给定一个整型数组,对这个整型素组排序,使得按序拼接数组各元素得到的值最小。
- 请设计一个算法,给一个字符串进行二进制编码,使得编码后字符串的长度最短。(哈弗曼编码)