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
原创粉丝点击