题意
给(n)个点,要求构造一张简单无向图,其中每个点入度都为(3),若可以构造则输出边数与边(顺序随意),无法构造则输出(Impossible)
算法
推理(qwq)
思路
首先,整张图的度数和应为(n imes3),而每连一条边度数和增加(2),故(n)为奇数肯定不合法。另外,图的最大边数应大于等于(n imes3),故(2)也是不合法的。
接着考虑构造:先连成首尾相连的环,这样每个点度数都为(2),然后连对角线即可(对角线连法见代码)。
代码
#include <bits/stdc++.h>
using namespace std;
int main(){
int n, vis[110];
while(scanf("%d", &n) != EOF && n){
if(n < 3 || (n & 1)){ printf("Impossible
"); continue;}
memset(vis,0,sizeof(vis));
printf("%d
", n * 3 / 2);
for(int i = 1; i < n; ++ i){
printf("%d %d
", i, i + 1);
if(!vis[i]){
vis[i] = vis[i + (n / 2)] = 1;
printf("%d %d
", i, i + (n / 2)); //连对角线
}
}
printf("%d %d
", n, 1);
}
return 0;
}