uva11134 相互不攻擊的車

/*uva11134
在N*N(1<=N<=5000)的棋盤上放置N個車,使它們相互不攻擊。
可是車有劃定的區間放置。
求解一種方案,是的每一個車能放置,沒有一種知足,輸出impossible
思路:
這種放置車的問題,通常思考到二分圖最大匹配上。
由於要求出到底放置到哪一個位置,因此要記錄下來匹配的點。
咱們發現行和列是能夠分類討論的(由於給定的區間是一個矩形,這樣,即便選定了某一行放置,全部的列仍是可供選擇的)
整理一下流程:例如行:
對車編號1--N,對行編號1--N;
若是一個車i能放置到第j行,咱們在i和j之間連一條i到j的有向邊。
咱們如今要找到一個最大匹配,一個匹配(即一條邊)的邏輯含義是i車放在j行。
這樣,咱們思考匹配尋找的過程。若 1->2,1->3,1->4,2->3,2->4,2->5.
*/ios

 1 #include <iostream>
 2 #include <cmath>
 3 #include <algorithm>
 4 #include <string.h>
 5 #include <stdio.h>
 6 #include <set>
 7 #include <stack>
 8 #include <vector>
 9 #define maxn 5010
10 using namespace std;
11 
12 int N;
13 struct Line{
14     int l,r,k;
15     bool operator<(const Line & X)const{
16         if (l==X.l) return r<X.r;else return l<X.l;
17     }
18     void print(){
19         printf("%d:[%d,%d]\n",k,l,r);
20     }
21 }X[maxn],Y[maxn];
22 int posX[maxn],posY[maxn];
23 int xl[maxn],yl[maxn],xr[maxn],yr[maxn];
24 void read(){
25     for(int i=1;i<=N;i++){
26         scanf("%d%d%d%d",&xl[i],&yl[i],&xr[i],&yr[i]);
27         X[i-1]=(Line){xl[i],xr[i],i};
28         Y[i-1]=(Line){yl[i],yr[i],i};
29     }
30 }
31 bool solveX(){
32     sort(X,X+N);
33     int p=0;
34     for(int i=1;i<=N;i++){
35         Line L=X[p];
36         L.print();
37         if(L.l<=i && L.r>=i) {
38             p++;
39             posX[L.k]=i;
40             cout<<"choose"<<i<<endl;
41         }else return false;
42     }
43     return true;
44 }
45 bool solveY(){
46     sort(Y,Y+N);
47     int p=0;
48     for(int i=1;i<=N;i++){
49         Line L=Y[p];
50         if (L.l<=i && L.r>=i) {
51             p++;
52             posY[L.k]=i;
53         }else return false;
54     }
55     return true;
56 }
57 void printans(){
58     for(int i=1;i<=N;i++){
59         printf("%d %d\n",posX[i],posY[i]);
60     }
61     return ;
62 }
63 int main(){
64     while(~scanf("%d",&N) && N>0){
65         read();
66         if (solveX() && solveY()) printans();
67         else printf("IMPOSSIBLE\n");
68     }
69     return 0;
70 }
相關文章
相關標籤/搜索