LA 4593 给一个无向图 让每一条边有方向 使得这个图无环 且最长链最短
来源:互联网 发布:网络健康度检测插件 编辑:程序博客网 时间:2024/05/29 10:51
#include<cstdio>#include<cstring>#define INF 0x3f3f3f3fusing 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]);elseprintf("%c %c\n",str[i][1],str[i][0]);}}}
阅读全文
0 0
- LA 4593 给一个无向图 让每一条边有方向 使得这个图无环 且最长链最短
- 给你一个 n 个点,m 条边的无向图,求至少要在这个的基础上加多少条无向边使得任意两个点可达~
- hdu6201(无向图最长路)
- Codeforces Round #375 (Div. 2) E. One-Way Reform(有n个点,m条无向边,给每条边定向,使得入度等于出度的点最多)
- Codeforces Beta Round #89 (Div. 2)E题,给一联通的无向图,求确定每边的方向,使得任意两点可达
- (POJ 3352)无向图的边双连通分量模板题 + 在一个图中最少加几条边可以使得图边双连通
- 只能努力,才有方向
- 有方向的运动js
- 给N条边,请找三条边,使其组成一个三角形,并使得这个三角形的周长最大。
- 数据结构笔记--创建一个无向图
- POJ 2485 Highways 无向图最小生成树求最长的边
- POJ 3352 Road Construction 使得无向图边变双连通图
- uva 10972 添加几条变使得无向图为双联通分量
- 有方向的CNN--Oriented Response Networks
- 有方向的CNN--Oriented Response Networks
- 图--无向图
- 无向图+BFS
- 无向图+DFS
- linux内容概述
- nexus安装与配置
- 【docker基础知识】docker基础概念
- FZU 2234 牧场物语(多进程dp)
- 请问下面的程序一共输出多少个“-”?
- LA 4593 给一个无向图 让每一条边有方向 使得这个图无环 且最长链最短
- jsp
- 前端开发的那点事-------------ie绝对是个神坑,360浏览器的兼容模式依然是个神坑
- JQuery的on和bind
- MFC软件设计经验分享
- (转)python爬虫技巧
- LertCode- 27. Remove Element
- 【洛谷P3796】【模板】AC自动机(加强版)
- 微信小程序学习点滴