洛谷1330 封锁阳光大学(DFS or BFS)

来源:互联网 发布:如何看待网络语言暴力 编辑:程序博客网 时间:2024/05/20 09:44
题目描述

曹是一只爱刷街的老曹,暑假期间,他每天都欢快地在阳光大学的校园里刷街。河蟹看到欢快的曹,感到不爽。河蟹决定封锁阳光大学,不让曹刷街。

阳光大学的校园是一张由N个点构成的无向图,N个点之间由M条道路连接。每只河蟹可以对一个点进行封锁,当某个点被封锁后,与这个点相连的道路就被封锁了,曹就无法在与这些道路上刷街了。非常悲剧的一点是,河蟹是一种不和谐的生物,当两只河蟹封锁了相邻的两个点时,他们会发生冲突。

询问:最少需要多少只河蟹,可以封锁所有道路并且不发生冲突。

输入输出格式

输入格式:

 

第一行:两个整数N,M

接下来M行:每行两个整数A,B,表示点A到点B之间有道路相连。

 

输出格式:

 

仅一行:如果河蟹无法封锁所有道路,则输出“Impossible”,否则输出一个整数,表示最少需要多少只河蟹。

【输入样例1】3 31 21 32 3【输入样例2】3 21 22 3
【输出样例1】Impossible【输出样例2】1

 染色问题,下面放上DFS和BFS的代码。

 1 #include<bits/stdc++.h> 2 using namespace std; 3 int a[200000]; 4 int n,m; 5 vector<int> v[100000]; 6 bool book[200000]; 7 int  t[2]; 8 int ans=0; 9 10 bool DFS(int from,int judge)11 {12     t[judge]++;13     book[from]=1;14     a[from]=judge;15     for(int i=0;i<v[from].size();i++)16     {17         int k=v[from][i];18         if(book[k]&&a[from]==a[k])19              return 0;20         else if(!book[k])21         {22              bool flag=DFS(k,(judge+1)&1);23              if(!flag)24                return 0;25         }26     }27 28     return 1;29 }30 31 32 int main()33 {34     ios::sync_with_stdio(false);35     cin>>n>>m;36     int x,y;37     for(int i=1;i<=m;i++)38     {39       cin>>x>>y;40       v[x].push_back(y);41       v[y].push_back(x);42     }43     for(int i=1;i<=n;i++)44     {45         if(!book[i])46         {47             48             t[0]=t[1]=0;49             bool ok=DFS(i,0);50             if(!ok)51             {52               cout<<"Impossible\n";53               return 0;54             }55             ans+=min(t[0],t[1]);56         }57         58     }59     cout<<ans<<endl;60    return 0;61 }
 1 #include<bits/stdc++.h> 2 using namespace std; 3 int a[200000]; 4 int n,m; 5 vector<int> v[100000]; 6 int  book[200000]; 7 int ans=0; 8 int t1,t2; 9 queue<int> q;10 11 int BFS(int k)12 {13    14    int judge=1;15    book[k]=judge;16    q.push(k);17    t1=t2=0;18    while(!q.empty())19    {20        judge++;21        int k=q.size(); 22        for(int i=0;i<k;i++)23        {24           int x=q.front();q.pop();25           for(int j=0;j<v[x].size();j++)26           {27                if(!book[v[x][j]])28                {29                    book[v[x][j]]=judge;30                    q.push(v[x][j]);31                }32                else if(book[v[x][j]]==book[x])33                  { return -1 ;}34           }35        }36        if(judge%2) t1+=k;37        else t2+=k;38    }39    return min(t1,t2);40 }41 42 int main()43 {44     ios::sync_with_stdio(false);45     cin>>n>>m;46     int x,y;47     for(int i=1;i<=m;i++)48     {49       cin>>x>>y;50       v[x].push_back(y);51       v[y].push_back(x);52     }53     for(int i=1;i<=n;i++)54     {55        if(!book[i])56        {57            int ok=BFS(i);58            if(ok==-1)59              {60                 cout<<"Impossible\n";61                 return 0;62              }63             ans+=ok;64        }65     }66     cout<<ans<<endl;67    return 0;68 }

 

原创粉丝点击