2020 CCPC Wannafly Winter Camp Day3.C. 无向图定向(k染色问题)
题目链接
题解思路:先说结论,最短的最长路=该无向图的最小染色数-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 '\n' 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; }
希望用自己的努力为自己赢得荣誉。