試題 算法訓練 Professor Monotonic’s Network
資源限制
時間限制:1.0s 內存限制:256.0MB
問題描述
無聊的教授最近在做一項關於比較網絡的實驗。一個比較網絡由若干個含兩個輸入端和兩個輸出端的比較器組成。如下圖,一個比較器將會比較它的兩個輸入端的值i1和i2,把它們防止在輸出端o1和o2上使得o1<=o2。
一個比較網絡有n個輸入端a1,a2,…,an和n個輸出端b1,b2,…,bn。對於每個比較器,它的輸入端要麼直接連在比較網絡的輸入端上,要麼連在另一個個比較器的輸出端上。這樣的關係組成的有向圖是無環的。下圖給出了一個擁有4個輸入端、4個輸出端、5個比較器的比較網絡。
在比較網絡運行時,值從輸入端輸入,然後比較器開始工作。當然,一個比較器僅當它的所有輸入值已經被算出來後才能開始工作。假設一個比較器需要1單位時間來工作。那麼,上面的例子中的比較網絡需要3單位時間來計算輸出值。圖中的comp-1和comp-2是並行工作的,comp-3和comp-4也是,comp-5只有等comp-3和comp-4完成後才能工作。
無聊的教授現在需要幫助確定那些比較網絡是排序網絡,並且它們需要多長時間來計算輸出值。一個排序網絡是一個比較網絡,並且無論輸入如何,它的輸出都單調增。上面的例子也是一個比較網絡。因爲對於每一種可能的輸入,輸出值都存在關係b1<=b2<=b3<=b4。
輸入格式
第一行兩個整數n,k,分別表示輸入值的個數和比較器的個數。
它們滿足1<=n<=12,0<=k<=150。
之後從左到右依次給出每個比較器的信息
之後每行兩個整數x,y表示第i個比較器將ax,ay做了比較,把其中較小的數放回ax,較大的數放回ay。
輸出格式
第一行輸出YES或NO表示該比較網絡是否是排序網絡
第二行輸出一個整數表示該比較網絡的運行時間。
樣例輸入
樣例1:
4 5
1 2
3 4
1 3
2 4
2 3
樣例2:
8 0
樣例3:
3 3
1 2
2 3
1 2
樣例輸出
樣例1:
YES
3
樣例2:
NO
0
樣例3:
YES
3
樣例說明
樣例1即圖片上所給的比較網絡。
package 第九次模擬;
import java.util.Scanner;
public class 排序 {
public static class Node{
int first;
int second;
}
static int n=0,m=0,x=0,y=0;
static int N=15;
static int []a = new int [N];
static int [] num = new int [N];
static int res=0;
static int cnt=0;
static Node [] T = new Node[155];
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
int n = sc.nextInt();
int m = sc.nextInt();
while(m-->0){
x= sc.nextInt();
y = sc.nextInt();
T[++cnt]=new Node();
T[cnt].first=x;
T[cnt].second=y;
int t =Math.max(num[x], num[y])+1;
num[x]=t;
num[y]=t;
res=Math.max(res, t);
}
sc.close();
boolean yes=true;
for(int i=0;i<(1<<n);i++){
for(int j=0;j<n;j++){
a[j+1]=(i>>j&1);
}
for(int j=1;j<=cnt;j++){
x=T[j].first;
y=T[j].second;
int tt=Math.min(a[x],a[y]);
a[y]=Math.max(a[x],a[y]);
a[x]=tt;
}
for(int j=1;j<n;j++)
if(a[j]==1&&a[j+1]==0){
yes=false;break;
}
if(!yes)
break;
}
if(yes)
System.out.println("YES");
else
System.out.println("NO");
System.out.println(res);
}
}
package 第九次模擬;
import java.util.Scanner;
public class 排序 {
//轉自https://blog.csdn.net/a1439775520/article/details/104653580
public static class Node{
int first;
int second;
}
public static void main(String[] args) {
int n=0,m=0,x=0,y=0;
int N=15;
int [] num = new int [N];
int res=0;
int cnt=0;
int t=0;
Node [] T = new Node[155];
Scanner sc = new Scanner(System.in);
n = sc.nextInt();
m = sc.nextInt();
while(m-->0){
x= sc.nextInt();
y = sc.nextInt();
T[++cnt]=new Node();
T[cnt].first=x;
T[cnt].second=y;
t = Math.max(num[x], num[y])+1;
num[x]=t;
num[y]=t;
res= Math.max(res, t);
}
sc.close();
int []a = new int [N];
int tt=0;
// boolean yes=true;
for(int i=0;i<(1<<n);i++){
for(int j=0;j<n;j++){
a[j+1]=(i>>j&1);
}
for(int j=1;j<=cnt;j++){
x=T[j].first;
y=T[j].second;
tt= Math.min(a[x],a[y]);
a[y]= Math.max(a[x],a[y]);
a[x]=tt;
}
for(int j=1;j<n;j++)
if(a[j]==1&&a[j+1]==0){
System.out.println("NO");
System.out.println(res);return;
}
// if(!yes)
// break;
}
// if(yes)
System.out.println("YES");
// else
// System.out.println("NO");
System.out.println(res);
}
// public static int min(int a,int b){
// return a<b?a:b;
// }
// public static int max(int a,int b){
// return a<b?b:a;
// }
}