[关闭]
@994495jj 2017-08-01T01:58:56.000000Z 字数 1505 阅读 815

cfgym100519H

201707


  1. #include<bits/stdc++.h>
  2. using namespace std;
  3. #define fi first
  4. #define se second
  5. #define mp make_pair
  6. #define pb push_back
  7. #define rep(i, a, b) for(int i=(a); i<(b); i++)
  8. #define sz(x) (int)x.size()
  9. #define de(x) cout<< #x<<" = "<<x<<endl
  10. typedef long long ll;
  11. typedef pair<int, int> pii;
  12. typedef vector<int> vi;
  13. //------
  14. const int N=1005;
  15. bool tag[N],vis[N];
  16. int n,m,k,o,siz;
  17. int deg[N],dis[N];
  18. vector<int> G[N];
  19. void dfs(int u) {
  20. if(vis[u]) return ;
  21. vis[u]=1;++siz;
  22. rep(i,0,sz(G[u])) dfs(G[u][i]);
  23. }
  24. int calc(int u,int mid) {
  25. memset(vis,0,sizeof(vis));
  26. int res=1;
  27. vector<int> q;
  28. q.pb(u);dis[u]=mid;vis[u]=1;
  29. rep(_,0,sz(q)) {
  30. int u=q[_];
  31. if(dis[u]==0) continue;
  32. rep(i,0,sz(G[u])) {
  33. int v=G[u][i];
  34. if(vis[v]) continue;
  35. dis[v]=dis[u]-1;
  36. vis[v]=1;
  37. q.pb(v);
  38. }
  39. }
  40. rep(i,1,n+1) {
  41. if(!vis[i]) {
  42. siz=0;dfs(i);
  43. res+=siz/(2*mid+1);
  44. if(siz%(2*mid+1)) ++res;
  45. }
  46. }
  47. return res;
  48. }
  49. bool check(int mid) {
  50. memset(tag,0,sizeof(tag));
  51. vector<int> q;
  52. q.pb(o);dis[o]=mid;tag[o]=1;
  53. rep(_,0,sz(q)) {
  54. int u=q[_];
  55. if(dis[u]==0) continue;
  56. rep(i,0,sz(G[u])) {
  57. int v=G[u][i];
  58. if(tag[v]) continue;
  59. dis[v]=dis[u]-1;
  60. tag[v]=1;
  61. q.pb(v);
  62. }
  63. }
  64. rep(i,1,n+1) {
  65. if(tag[i]&&calc(i,mid)<=k) return 1;
  66. }
  67. return 0;
  68. }
  69. int main(){
  70. ///
  71. scanf("%d%d%d",&n,&m,&k);
  72. ///read
  73. rep(i,0,m) {
  74. int u,v;scanf("%d%d",&u,&v);
  75. ++deg[u];++deg[v];
  76. G[u].pb(v);
  77. G[v].pb(u);
  78. }
  79. ///
  80. if(k>=n) {
  81. puts("0");
  82. return 0;
  83. }
  84. ///get o
  85. o=-1;int t=1;
  86. rep(i,1,n+1) {
  87. if(deg[i]>2) o=i;
  88. if(deg[i]==1) t=i;
  89. }
  90. if(o==-1) o=t;
  91. ///solve
  92. int l=1,r=n,ans=-1;
  93. while(l<=r) {
  94. int mid=(l+r)>>1;
  95. if(check(mid)) {
  96. ans=mid;
  97. r=mid-1;
  98. } else l=mid+1;
  99. }
  100. ///print
  101. printf("%d\n",ans);
  102. return 0;
  103. }
添加新批注
在作者公开此批注前,只有你和作者可见。
回复批注