您的位置:首页 > 其它

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]);
}
}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐