题解思路:先说结论,最短的最长路=该无向图的最小染色数-1。其实这很好感觉出来,但具体证明请参照狄尔沃斯定理。至于如何求无向图的最小染色数,由于数据较小,可以直接状压dp或是dfs回溯求得。
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
typedef pair<int,int> PII;
#define ls l,mid,rt<<1
#define rs mid+1,r,rt<<1|1
#define endl '
'
const int MAXN = 10+10;
const double EPS = 1e-12;
const ll mod = 1e9+7;
map<PII,bool>mp;
int T,n,m,now,ans=1e9;
vector<int>G[MAXN],col[MAXN];
bool check(int u,int x){
for(auto v:col[x]){
if(mp[PII(v,u)])return 0;
}
return 1;
}
void dfs(int u,int sum){
if(u==n+1){
ans=min(ans,sum);
return ;
}
if(sum>ans)return;
for(int i=1;i<=sum+1;i++){
if(i==sum+1){
col[++now].push_back(u);
dfs(u+1,sum+1);
col[now].pop_back();now--;
}
else if(check(u,i)){
col[i].push_back(u);
dfs(u+1,sum);
col[i].pop_back();
}
}
}
int main()
{
scanf("%d %d",&n,&m);
int u,v;
for(int i=1;i<=m;i++){
scanf("%d %d",&u,&v);
G[u].push_back(v);
G[v].push_back(u);
mp[PII(u,v)]=mp[PII(v,u)]=1;
}
dfs(1,0);
cout<<ans-1<<endl;
}