曹是乙隻愛刷街的老曹,暑假期間,他每天都歡快地在陽光大學的校園裡刷街。河蟹看到歡快的曹,感到不爽。河蟹決定封鎖陽光大學,不讓曹刷街。
陽光大學的校園是一張由n個點構成的無向圖,n個點之間由m條道路連線。每只河蟹可以對乙個點進行封鎖,當某個點被封鎖後,與這個點相連的道路就被封鎖了,曹就無法在與這些道路上刷街了。非常悲劇的一點是,河蟹是一種不和諧的生物,當兩隻河蟹封鎖了相鄰的兩個點時,他們會發生衝突。
詢問:最少需要多少只河蟹,可以封鎖所有道路並且不發生衝突。
輸入格式:
第一行:兩個整數n,m
接下來m行:每行兩個整數a,b,表示點a到點b之間有道路相連。
輸出格式:
僅一行:如果河蟹無法封鎖所有道路,則輸出「impossible」,否則輸出乙個整數,表示最少需要多少只河蟹。
輸入樣例#1: 複製
3 31 21 3
2 3
輸出樣例#1: 複製
impossible
輸入樣例#2: 複製
3 21 22 3
輸出樣例#2: 複製
1
【資料規模】
1<=n<=10000,1<=m<=100000,任意兩點之間最多有一條道路。
這個題有思路的話就很水
首先對於每一條邊 他的兩個端點都必須只有乙個有河蟹
那麼每乙個點都只有有河蟹 和沒河蟹兩種狀態
所以為什麼不跑乙個dfs?對於圖都設定乙個起點 然後起點有河蟹跑一次 沒河蟹再跑一次 將較小值加進答案 兩種都違法就impossible
dfs的具體定義是 對於每乙個起點 向每個跟他聯通的沒訪問的節點進行訪問並設定成跟起點不一樣的狀態
如果訪問過了就判斷是否跟起點狀態不同 若否則不合法
最後 圖不一定聯通
注意一下就可以ac了
**:
#include#define inf 1000000000using
namespace
std;
intn,m,tra1,tra2;
int sum[2
];struct
edgeedge[
200010
];int head[10010],ectr,ans,color[10010
];void addedge(int u,int
v)bool vis[10010
];queue
q;bool bfs(int start_point,int
start_color)
color[v]=nxc;
vis[v]=true
; sum[nxc]++;
q.push(v);}}
return
true;}
intmain()
for(int i=1;i<=n;i++)
ans+=min(sum[0],sum[1
]); }
cout
return0;
}
tag : sin_xiii ⑨
洛谷 P1330 封鎖陽光大學
曹是乙隻愛刷街的老曹,暑假期間,他每天都歡快地在陽光大學的校園裡刷街。河蟹看到歡快的曹,感到不爽。河蟹決定封鎖陽光大學,不讓曹刷街。陽光大學的校園是一張由n個點構成的無向圖,n個點之間由m條道路連線。每只河蟹可以對乙個點進行封鎖,當某個點被封鎖後,與這個點相連的道路就被封鎖了,曹就無法在與這些道路上...
洛谷 P 1330 封鎖陽光大學
題目描述 曹是乙隻愛刷街的老曹,暑假期間,他每天都歡快地在陽光大學的校園裡刷街。河蟹看到歡快的曹,感到不爽。河蟹決定封鎖陽光大學,不讓曹刷街。陽光大學的校園是一張由n個點構成的無向圖,n個點之間由m條道路連線。每只河蟹可以對乙個點進行封鎖,當某個點被封鎖後,與這個點相連的道路就被封鎖了,曹就無法在與...
洛谷 P1330 封鎖陽光大學
曹是乙隻愛刷街的老曹,暑假期間,他每天都歡快地在陽光大學的校園裡刷街。河蟹看到歡快的曹,感到不爽。河蟹決定封鎖陽光大學,不讓曹刷街。陽光大學的校園是 一張由n個點構成的無向圖,n個點之間由m條道路連線。每只河蟹可以對乙個點進行封鎖,當某個點被封鎖後,與這個點相連的道路就被封鎖了,曹就無法在與這些道路...