http://acm.timus.ru/problem.aspx?space=1&num=1323
没有想那么多 直接暴力 dfs
代码:
#include<iostream>
#include<cstdio>
#include<cstring>
#include<string>
#include<map>
#include<vector>
#include<stack>
#include<set>
#include<map>
#include<queue>
#include<algorithm>
#include<cmath>
#define LL long long
#define sint short int
//#pragma comment(linker, "/STACK:1024000000,1024000000")
using namespace std;
const int N=105;
const int INF=0x3f3f3f3f;
vector<int>a[N];
bool had[N];
struct node
{
int p,t;
}mem[N],ans[N];
bool link[N][N];
map<string,int>mt;
string s[N];
int n,T;
void dfs(int i,int j,int num,int t1)
{
if(num==n)
{
if(t1<T)
{
T=t1;
for(int i=0;i<n;++i)
{ans[i].p=mem[i].p;ans[i].t=mem[i].t;}
}
return ;
}
int k=a[i][j];
bool flag=false;
for(int l=0;l<n;++l)
if(!had[l]&&link[k][l])
{
flag=true;
had[l]=true;
a[i+1].push_back(k);
a[i+1].push_back(l);
mem[l].p=k;
mem[l].t=i+1;
if(j==a[i].size()-1)
dfs(i+1,0,num+1,max(t1,mem[l].t));
else
dfs(i,j+1,num+1,max(t1,mem[l].t));
a[i+1].erase(a[i+1].end()-1);
a[i+1].erase(a[i+1].end()-1);
had[l]=false;
}
if(flag==false)
{
if(j==a[i].size()-1)
dfs(i+1,0,num,t1);
else
dfs(i,j+1,num,t1);
}
}
int main()
{
//freopen("data.in","r",stdin);
int m;
cin>>n>>m;
memset(link,false,sizeof(link));
int k=0;
while(m--)
{
string s1,s2;
cin>>s1>>s2;
if(mt.find(s1)==mt.end())
{s[k]=s1;mt[s1]=k++;}
if(mt.find(s2)==mt.end())
{s[k]=s2;mt[s2]=k++;}
link[mt[s1]][mt[s2]]=true;
link[mt[s2]][mt[s1]]=true;
}
string st;
cin>>st;
if(n==1)
{cout<<"0"<<endl;return 0;}
k=mt[st];
mem[k].p=-1;
mem[k].t=0;
a[0].push_back(k);
memset(had,false,sizeof(had));
had[k]=true;
T=INF;
dfs(0,0,1,0);
cout<<T<<endl;
for(int i=1;i<=T;++i)
{
int tmp=0;
for(int j=0;j<n;++j)
if(ans[j].t==i)
++tmp;
cout<<tmp<<endl;
for(int j=0;j<n;++j)
if(ans[j].t==i)
cout<<s[ans[j].p]<<" "<<s[j]<<endl;
}
return 0;
}