1888. Pilot Work Experience(dfs+bfs)

1888

dfs找出连通块 块内构造数据 bfs找出最值 

如果有多个连通块 那max就为49 可以起点不同  这样记得修改后面的数据

写的老长了。。

  1 #include <iostream>
  2 #include<cstdio>
  3 #include<cstring>
  4 #include<algorithm>
  5 #include<stdlib.h>
  6 #include<vector>
  7 #include<queue>
  8 using namespace std;
  9 vector<int>ed[55];
 10 int vis[55],gg,p,g,maxz,o[55],pp[55][55],q[55];
 11 int w[55],mm[55];
 12 void dfs(int u)
 13 {
 14     gg++;
 15     pp[g][gg] = u;
 16     int i;
 17     for(i = 0 ; i < (int)ed[u].size() ; i++)
 18     {
 19         int k = ed[u][i];
 20         if(!o[k])
 21         {
 22             o[k] = 1;
 23             dfs(k);
 24         }
 25     }
 26 }
 27 int bfs(int u,int k)
 28 {
 29     int i,tt=0;
 30     for(i = 1; i <= q[k] ; i++)
 31     {
 32         vis[pp[k][i]] = 0;
 33     }
 34     queue<int>qq;
 35     qq.push(u);
 36     vis[u] = 1;
 37     while(!qq.empty())
 38     {
 39         int k = qq.front();
 40         tt = max(vis[k],tt);
 41         qq.pop();
 42         for(i = 0 ; i < (int)ed[k].size() ; i++)
 43         {
 44             int v = ed[k][i];
 45             if(vis[v]>50)
 46             return -1;
 47             if(vis[v]&&abs(vis[v]-vis[k])!=1)
 48             {
 49                 return -1;
 50             }
 51             if(!vis[v])
 52             {
 53                 vis[v] = vis[k]+1;
 54                 qq.push(v);
 55             }
 56         }
 57     }
 58     if(maxz<tt)
 59     {
 60         maxz = tt;
 61         mm[k] = maxz;
 62         for(i = 1; i <= q[k] ; i++)
 63        {
 64            w[pp[k][i]] = vis[pp[k][i]];
 65        }
 66     }
 67     return 1;
 68 }
 69 int main()
 70 {
 71     int n,i,j;
 72     scanf("%d%d",&n,&p);
 73     for(i = 1; i <= n ; i++)
 74     {
 75         int u,v;
 76         scanf("%d%d",&u,&v);
 77         ed[u].push_back(v);
 78         ed[v].push_back(u);
 79     }
 80     g = 1;
 81     for(i = 1; i <= p ; i++)
 82     {
 83         if(!o[i])
 84         {
 85             o[i] =1;
 86             dfs(i);
 87             q[g] = gg;
 88             gg=0;g++;
 89         }
 90     }
 91     int nu=0;
 92     for(i = 1; i < g ; i++)
 93     {
 94         int kk=0;
 95         maxz=0;
 96         for(j = 1; j <= q[i] ; j++)
 97         {
 98             if(bfs(pp[i][j],i)>0)
 99             {
100                 kk=1;
101             }
102         }
103         if(!kk)
104         {
105             maxz=0;
106             break;
107         }
108     }
109     if(maxz==0)
110     printf("-1\n");
111     else
112     {
113         if(g>2)
114         {
115             printf("49\n");
116             for(i = 1 ; i <= q[1] ; i++)
117             w[pp[1][i]]+=(50-mm[1]);
118         }
119         else
120         {
121             printf("%d\n",maxz-1);
122         }
123         for(i = 1; i <= p ; i++)
124         printf("%d ",w[i]);
125         puts("");
126     }
127     return 0;
128 }
View Code

 

 

posted @ 2013-10-16 19:37  _雨  阅读(342)  评论(0编辑  收藏  举报