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

 

 

你可能感兴趣的:(exp)