P1330 封锁阳光大学
生活随笔
收集整理的這篇文章主要介紹了
P1330 封锁阳光大学
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
P1330 封鎖陽光大學
題目描述
曹是一只愛刷街的老曹,暑假期間,他每天都歡快地在陽光大學的校園里刷街。河蟹看到歡快的曹,感到不爽。河蟹決定封鎖陽光大學,不讓曹刷街。
陽光大學的校園是一張由N個點構成的無向圖,N個點之間由M條道路連接。每只河蟹可以對一個點進行封鎖,當某個點被封鎖后,與這個點相連的道路就被封鎖了,曹就無法在與這些道路上刷街了。非常悲劇的一點是,河蟹是一種不和諧的生物,當兩只河蟹封鎖了相鄰的兩個點時,他們會發生沖突。
詢問:最少需要多少只河蟹,可以封鎖所有道路并且不發生沖突。
輸入輸出格式
輸入格式:
?
第一行:兩個整數N,M
接下來M行:每行兩個整數A,B,表示點A到點B之間有道路相連。
?
輸出格式:
?
僅一行:如果河蟹無法封鎖所有道路,則輸出“Impossible”,否則輸出一個整數,表示最少需要多少只河蟹。
?
輸入輸出樣例
輸入樣例#1:3 3 1 2 1 3 2 3 輸出樣例#1:
Impossible 輸入樣例#2:
3 2 1 2 2 3 輸出樣例#2:
1
說明
【數據規模】
1<=N<=10000,1<=M<=100000,任意兩點之間最多有一條道路。
?
1 /* 2 首先需要認識到圖不一定是連通圖。因此我們完全可以忽視孤立的點。從1開始枚舉點到n, 3 要是沒有被研究過并且不是孤立的點的話就對它進行染色。每個連通塊之間互不影響, 4 所以我們對于每個連通塊累加min{色塊1的個數,色塊2的個數}即可。 5 */ 6 #include <iostream> 7 #include <cstdio> 8 #include <vector> 9 using namespace std; 10 int n, m, uu, vv, ans1, ans2, ans, shux[10005]={0}; 11 vector<int> edge[10005];//vector好用 12 bool u[10005]; 13 void hx(int nl, int sx){//當前處在nl點,想染上sx的顏色 14 //我已經染過色了,并且我染的不是sx的顏色 15 if(shux[nl] && shux[nl]!=sx){//染糊了 16 cout<<"Impossible"; 17 exit(0); 18 } 19 if(shux[nl]) return ;//幽雅地返回吧,染過色的點 20 //已經染色了 21 u[nl] = true; 22 //給他染sx色 23 shux[nl] = sx; 24 //染的是1號色,ans1++,染的是2號色,ans2++ 25 if(sx==1) ans1++; 26 else ans2++; 27 //對n1相鄰的節點染不同的顏色,如果n1染的1號色,周圍就染2號色,如果染2號色,周圍就染1號色 28 for(int i=0; i<edge[nl].size(); i++) 29 hx(edge[nl][i], sx==1?2:1);//相鄰點染色不同 30 } 31 int main(){ 32 cin>>n>>m; 33 for(int i=1; i<=m; i++){ 34 scanf("%d %d", &uu, &vv); 35 edge[uu].push_back(vv); 36 edge[vv].push_back(uu); 37 } 38 for(int i=1; i<=n; i++) 39 //u[i]沒有被訪問過且i不是孤立的點 40 if(!u[i] && edge[i].size()){ 41 ans1 = ans2 = 0;//累加每種色塊個數的變量記得清零 42 //當前處在i點,想染上1的顏色 43 hx(i, 1); 44 //對于不同的聯通圖,要加上 45 ans += min(ans1, ans2); 46 } 47 cout<<ans; 48 return 0; 49 }?
忘記寫16行的cin>>那句話
1 #include <bits/stdc++.h> 2 const int M=1e5+10; 3 const int N=1e4+10; 4 using namespace std; 5 int n,m,vis[N]; 6 vector<int> vct[N]; 7 queue<int> q; 8 int edgeNum[N]; 9 int num; 10 int minNum=0x3fffffff; 11 12 void init(){ 13 cin>>n>>m; 14 for(int i=1;i<=m;i++){ 15 int u,v; 16 cin>>u>>v;//這句話忘記了 17 edgeNum[u]++; 18 vct[u].push_back(v); 19 edgeNum[v]++; 20 vct[v].push_back(u); 21 } 22 } 23 24 bool check(){ 25 for(int i=1;i<=n;i++){ 26 if(vis[i]==1){ 27 for(int j=0;j<edgeNum[i];j++){ 28 int v=vct[i][j]; 29 if(vis[v]==1) return false; 30 } 31 } 32 } 33 return true; 34 } 35 36 void search(){ 37 while(!q.empty()){ 38 int p=q.front(); q.pop(); 39 if(vis[p]!=0) continue; 40 vis[p]=2;//被河蟹封鎖的點 41 num++; 42 for(int i=0;i<edgeNum[p];i++){ 43 int v=vct[p][i]; 44 vis[v]=1;//不能站河蟹的點 45 } 46 if(check()){ 47 if(num<minNum){ 48 minNum=num; 49 } 50 } 51 52 } 53 } 54 55 void find(){ 56 //O(n*n+n*n*n) 57 for(int i=1;i<=n;i++){ 58 int num1=n,i1=i; 59 while(num1--){ 60 if(i1>n) i1-=n; 61 q.push(i1++); 62 } 63 memset(vis,0,sizeof(vis)); 64 num=0; 65 search(); 66 } 67 } 68 69 void print(){ 70 if(minNum==0x3fffffff) cout<<"Impossible"<<endl; 71 else cout<<minNum<<endl; 72 } 73 74 int main(){ 75 //freopen("in2.txt","r",stdin); 76 init(); 77 find(); 78 print(); 79 return 0; 80 }?
1 #include <bits/stdc++.h> 2 const int N=1e4+10; 3 using namespace std; 4 int n,m,color[N],ans,ans1,ans2; 5 bool vis[N]; 6 vector<int> vct[N]; 7 8 void setColor(int p,int type){ 9 if(color[p]&&color[p]!=type){ 10 cout<<"Impossible"<<endl; 11 exit(0); 12 } 13 if(color[p]) return; 14 vis[p]=true; 15 color[p]=type; 16 if(type==1) ans1++;else ans2++; 17 for(int i=0;i<vct[p].size();i++){ 18 setColor(vct[p][i],type==1?2:1); 19 } 20 } 21 22 int main(){ 23 //freopen("in.txt","r",stdin); 24 cin>>n>>m; 25 for(int i=1;i<=m;i++){ 26 int u,v; 27 cin>>u>>v; 28 vct[u].push_back(v); 29 vct[v].push_back(u); 30 } 31 for(int i=1;i<=n;i++){ 32 if(!vis[i]&&!vct[i].empty()){ 33 ans1=0,ans2=0; 34 setColor(i,1); 35 ans+=min(ans1,ans2); 36 } 37 } 38 cout<<ans<<endl; 39 return 0; 40 }?
轉載于:https://www.cnblogs.com/Renyi-Fan/p/7554897.html
總結
以上是生活随笔為你收集整理的P1330 封锁阳光大学的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 怪物猎人世界坚硬岩骨在哪 坚硬岩骨在哪儿
- 下一篇: 总资产怎么算 总资产的计算方法