染色問題
基准時間限制:1 秒 空間限制:10240 KB 分值: 40 一個n(3<=n<=100)個點的完全圖,現在給出n,要求將每條邊都染上一種顏色k(1<=k<=n),最終使得所有三個點構成的環(C(n,3)個不同的換)上三條邊的顏色和在所有顏色中任選三種顏色的組合(C(n,3)種方案)一一對應,由你來給出染色方案。 本題有多組數據 Input第一行一個整數T,表示數據組數 接下來T行每行一個整數n,表示完全圖的點數Output
輸出由T個部分組成 每個部分的第一行一個整數n,表示完全圖的點數 第二行表示構造結果 如果無解輸出No solution 否則輸出n*(n-1)/2條邊的起點、終點和顏色Input示例
2 4 3Output示例
4 No solution 3 1 2 3 2 3 1 3 1 2
一開始看這個題又是環又是圖又是排列組合的還以為很麻煩,不過讀完題發現其實沒有那麼復雜。題目的樣例也完全不用糾結,輸入3可以像樣例那樣輸出,也完全可以按自己想的顏色輸出(我的程序跑3的結果就是1 2 1 1 3 2 2 3 3,但是可以AC)。然後再找一下規律,就是兩個點間染一個顏色,然後以這兩個點為一個端點的線都不能再染這個顏色了,這樣下來就是自己找規律看如何填顏色了。如果輸入的是偶數那麼無論如何都做不到這一點,所以偶數就直接輸出"No solution"就好了,奇數的話再找下規律,我是先順著填的顏色,最後填完發現顏色數量正好再觀察下我畫的表的規律,寫出了程序。
下面是我以輸入7為例填的表格,兩邊表示兩個點,裡面的代號是這兩個點間邊的顏色
1 2 3 4 5 6 7 1 \ 1 2 3 4 5 6 2 1 \ 3 4 5 6 7 3 2 3 \ 5 6 7 1 4 3 4 5 \ 7 1 2 5 4 5 6 7 \ 2 3 6 5 6 7 1 2 \ 4 7 6 7 1 2 3 4 \
填顏色的方法應該不止一種,找出來一種就好了,然後我根據我的表的規律寫的代碼,下面是AC代碼
#include<iostream> #include<cstdio> #include<cstring> #include<algorithm> using namespace std; int a[1005]; int main() { int T; int n; int i,j; int k,t; scanf("%d",&T); while(T--) { scanf("%d",&n); cout<<n<<endl; if(n%2==0) cout<<"No solution"<<endl; else { t=1; for(i=1;i<n-1;i++) { k=t; for(j=i+1;j<=n;j++) { cout<<i<<" "<<j<<" "<<k<<" "; k=(k+1)%n; if(k==0) k=n; } t=(t+2)%n; if(t==0) t=n; } cout<<n-1<<" "<<n<<" "<<k<<endl; } } return 0; }