JOI2007本選 問題4@C++
しかしsol_checkが動かないので正答か確認できない
いや、Windows台なら動くかもしれないんだけどさ・・・・・・・・
まあどちらにせよ、cygwin1.dllはバージョンによって互換性がないらしいので、ソースがあったほうがいいのは確か。
ということでJOIのinfoにメール送っておいた。
内容はトポロジカルソート。合宿でやったので覚えてる。
まだこのソースで正しいと決まったわけではないので注意。
#include <cstdio> #include <vector> #include <algorithm> using namespace std; void topological_visit(int n, vector<vector<signed char> > &table, vector<bool> &flags, vector<int> &dest, int at) { flags[at] = true; for(int i=0;i<n;i++) { if(!flags[i] && table[at][i] == -1) { topological_visit(n, table, flags, dest, i); } } dest.push_back(at); } int main(int argc, char *argv[], char *envp[]) { #ifdef DEBUG FILE *in = stdin; FILE *out = stdout; #else FILE *in = fopen("input.txt", "r"); FILE *out = fopen("output.txt", "w"); #endif int n; int m; fscanf(in, "%d\n", &n); fscanf(in, "%d\n", &m); //printf("sizeof(signed char)==%d, sizeof(bool)==%d, sizeof(int)==%d\n", sizeof(signed char), sizeof(bool), sizeof(int)); vector<vector<signed char> > table(n, vector<signed char>(n)); for(int i=0;i<m;i++) { int a; int b; fscanf(in, "%d %d\n", &a, &b); a--; b--; table[a][b] = 1; table[b][a] = -1; } vector<bool> flags(n); vector<int> dest; for(int i=0;i<n;i++) { if(!flags[i]) { topological_visit(n, table, flags, dest, i); } } bool single_answer_flag = true; for(unsigned int i=0;i<dest.size();i++) { fprintf(out, "%d\n", dest[i]+1); if(i+1 < dest.size() && table[dest[i]][dest[i+1]] == 0) { single_answer_flag = false; } } fprintf(out, "%d\n", !single_answer_flag); fclose(in); fclose(out); return 0; }