#include<iostream> #include<vector> using namespace std; int n,m; int tab[1005][1005]; vector<int>graf[1005]; int ilu_chce_szefow[1005]; int ilu_mnie_nie_chce[1005]; int zuzyty[1005]; int odp[1005]; bool odw[1005]; void DFS(int x){ odw[x]=1; for(int i=0;i<graf[x].size();i++){ if(zuzyty[graf[x][i]]==1) { graf[x][i]=graf[x][graf[x].size()-1]; graf[x].pop_back(); i--; continue; } if(odw[graf[x][i]]==0){DFS(graf[x][i]);} } } bool licz(vector <int> wierzcholki, int szef){ if(wierzcholki.size()==0){return 1;} for(int i=0;i<wierzcholki.size();i++){ int x=wierzcholki[i]; if(ilu_chce_szefow[x]==0&&ilu_mnie_nie_chce[x]==0){//drugi warunek wymaga zmienienia zuzyty[x]=1; odp[x]=szef; for(int j=1;j<=n;j++){ if(tab[j][x]==1){ilu_chce_szefow[j]--;} if(tab[x][j]==-1){ilu_mnie_nie_chce[j]--;}//??? } wierzcholki[i]=wierzcholki[wierzcholki.size()-1]; wierzcholki.pop_back(); return licz(wierzcholki,x); } } //for(int i=0;i<wierzcholki.size();i++){cerr<<wierzcholki[i]<<" ";} //cerr<<"X"<<wierzcholki.size()<<" "<<szef<<"dane 2:"<<ilu_chce_szefow[2]<<ilu_mnie_nie_chce[2]<<"\n"; if(wierzcholki.size()==n){return 0;} DFS(wierzcholki[0]); vector<int> wierzcholki2; vector<int>wierzcholki3; for(int i=0;i<wierzcholki.size();i++){ if(odw[wierzcholki[i]]==1) { odw[wierzcholki[i]]=0; wierzcholki2.push_back(wierzcholki[i]); } else{wierzcholki3.push_back(wierzcholki[i]);} } //cerr<<"w2:"; //for(int i=0;i<wierzcholki2.size();i++){cerr<<wierzcholki2[i]<<" ";} //cerr<<"\nw3:"; //for(int i=0;i<wierzcholki3.size();i++){cerr<<wierzcholki3[i]<<" ";} //cerr<<"\n"; if(wierzcholki3.size()==0){return 0;} else{ for(int i=0;i<wierzcholki2.size();i++){ for(int j=0;j<wierzcholki3.size();j++){ int w1=wierzcholki2[i]; int w2=wierzcholki3[j]; if(tab[w1][w2]==-1){ilu_mnie_nie_chce[w2]--;tab[w1][w2]=0;} if(tab[w2][w1]==-1){ilu_mnie_nie_chce[w1]--;tab[w2][w1]=0;} } } return min(licz(wierzcholki2,szef),licz(wierzcholki3,szef)); } } int main(){ ios_base::sync_with_stdio(0); cin.tie(0); cin>>n>>m; for(int i=0;i<m;i++){ int a,b;char z; cin>>a>>b>>z; if(z=='T'){tab[a][b]=1;graf[a].push_back(b);graf[b].push_back(a);ilu_chce_szefow[a]++;} if(z=='N'){tab[a][b]=-1;ilu_mnie_nie_chce[b]++;} } vector <int> wszystko; for(int i=1;i<=n;i++){wszystko.push_back(i);} if(licz(wszystko,0)==0){cout<<"NIE";} else{ for(int i=1;i<=n;i++){ cout<<odp[i]<<"\n"; } } /* for(int i=0;i<n;i++){ for(int j=1;j<=n;j++){ if(zuzyty[j]==0&&ilu_chce_szefow[j]==0&&ilu_mnie_nie_chce[j]==0){ zuzyty[j]=1; for(int k=1;k<=n;k++){ if(tab[k][j]==1){ilu_chce_szefow[k]--;} if(tab[j][k]==-1){ilu_mnie_nie_chce[k]--;} } break; } if(j==n){cout<<"NIE\n";return 0;} } } cout<<"TAK\n"; */ }
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 | #include<iostream> #include<vector> using namespace std; int n,m; int tab[1005][1005]; vector<int>graf[1005]; int ilu_chce_szefow[1005]; int ilu_mnie_nie_chce[1005]; int zuzyty[1005]; int odp[1005]; bool odw[1005]; void DFS(int x){ odw[x]=1; for(int i=0;i<graf[x].size();i++){ if(zuzyty[graf[x][i]]==1) { graf[x][i]=graf[x][graf[x].size()-1]; graf[x].pop_back(); i--; continue; } if(odw[graf[x][i]]==0){DFS(graf[x][i]);} } } bool licz(vector <int> wierzcholki, int szef){ if(wierzcholki.size()==0){return 1;} for(int i=0;i<wierzcholki.size();i++){ int x=wierzcholki[i]; if(ilu_chce_szefow[x]==0&&ilu_mnie_nie_chce[x]==0){//drugi warunek wymaga zmienienia zuzyty[x]=1; odp[x]=szef; for(int j=1;j<=n;j++){ if(tab[j][x]==1){ilu_chce_szefow[j]--;} if(tab[x][j]==-1){ilu_mnie_nie_chce[j]--;}//??? } wierzcholki[i]=wierzcholki[wierzcholki.size()-1]; wierzcholki.pop_back(); return licz(wierzcholki,x); } } //for(int i=0;i<wierzcholki.size();i++){cerr<<wierzcholki[i]<<" ";} //cerr<<"X"<<wierzcholki.size()<<" "<<szef<<"dane 2:"<<ilu_chce_szefow[2]<<ilu_mnie_nie_chce[2]<<"\n"; if(wierzcholki.size()==n){return 0;} DFS(wierzcholki[0]); vector<int> wierzcholki2; vector<int>wierzcholki3; for(int i=0;i<wierzcholki.size();i++){ if(odw[wierzcholki[i]]==1) { odw[wierzcholki[i]]=0; wierzcholki2.push_back(wierzcholki[i]); } else{wierzcholki3.push_back(wierzcholki[i]);} } //cerr<<"w2:"; //for(int i=0;i<wierzcholki2.size();i++){cerr<<wierzcholki2[i]<<" ";} //cerr<<"\nw3:"; //for(int i=0;i<wierzcholki3.size();i++){cerr<<wierzcholki3[i]<<" ";} //cerr<<"\n"; if(wierzcholki3.size()==0){return 0;} else{ for(int i=0;i<wierzcholki2.size();i++){ for(int j=0;j<wierzcholki3.size();j++){ int w1=wierzcholki2[i]; int w2=wierzcholki3[j]; if(tab[w1][w2]==-1){ilu_mnie_nie_chce[w2]--;tab[w1][w2]=0;} if(tab[w2][w1]==-1){ilu_mnie_nie_chce[w1]--;tab[w2][w1]=0;} } } return min(licz(wierzcholki2,szef),licz(wierzcholki3,szef)); } } int main(){ ios_base::sync_with_stdio(0); cin.tie(0); cin>>n>>m; for(int i=0;i<m;i++){ int a,b;char z; cin>>a>>b>>z; if(z=='T'){tab[a][b]=1;graf[a].push_back(b);graf[b].push_back(a);ilu_chce_szefow[a]++;} if(z=='N'){tab[a][b]=-1;ilu_mnie_nie_chce[b]++;} } vector <int> wszystko; for(int i=1;i<=n;i++){wszystko.push_back(i);} if(licz(wszystko,0)==0){cout<<"NIE";} else{ for(int i=1;i<=n;i++){ cout<<odp[i]<<"\n"; } } /* for(int i=0;i<n;i++){ for(int j=1;j<=n;j++){ if(zuzyty[j]==0&&ilu_chce_szefow[j]==0&&ilu_mnie_nie_chce[j]==0){ zuzyty[j]=1; for(int k=1;k<=n;k++){ if(tab[k][j]==1){ilu_chce_szefow[k]--;} if(tab[j][k]==-1){ilu_mnie_nie_chce[k]--;} } break; } if(j==n){cout<<"NIE\n";return 0;} } } cout<<"TAK\n"; */ } |