リンク先問題なのですfが、ある人の後にはいった人の関係を→付きのグラフで表現してそれを地道に数えればいんじゃないかなと考えまして解いてみたのですが、なんとこの問題、テストデータによるコードの自動ジャッジが未実装。
頭の良い方実力のある方、コードの判定、もしくは考え方のご指摘をお願いします。
追記 プログラム勉強法のページ作りは私自身がプログラマとして未熟でプログラムの勉強に忙しので完全に諦めました。あの分はどうもすいませんでした。
正しいかどうかわからないコード。
#include <iostream>
int *rank;//後ろに並んでいる人数
int *g;//グラフ
bool *moveFlag;//一度数えた人を何度も数えないようにするための処置
int *backSums;//ある人の後ろに並んでいた人数のメモ
int m;//人数
int n;//証言の数
int sum;//ある人の後ろに並んでいる人の人数
void search(int,int);
void sort(void);
void swap(int *,int *);
int main(void){
std::cin >> m >> n;
rank = new int[m];
g = new int[m*m];
moveFlag= new bool[m];
backSums= new int[m];
//グラフの初期化m*m人分
for(int i=0;i<m*m;i++){
g[i]=0;
}
//証言データの読み込み
int a,b;
for(int i=0;i<n;i++){
std::cin >> a >> b;
a--;
b--;
g[a*m+b]=1;
}
//後ろに並んでいる人数の計算
for(int i=0;i<m;i++){
sum=0;
for(int j=0;j<m;j++){
moveFlag[j]=false;
}
search(i,i);
backSums[i]=sum;
}
for(int i=0;i<m;i++){
//std::cout <<backSums[i]<<"\n";
}//データ確認用
sort();
delete [] backSums;
delete [] moveFlag;
delete [] rank;
delete [] g;
}
void sort(void){
int *ids=new int[m];
for(int i=0;i<m;i++){
ids[i]=i+1;
}
int t;
for(int i=0;i<m-1;i++){
for(int j=i+1;j<m;j++){
if(backSums[i]<backSums[j]){
swap(&backSums[i],&backSums[j]);
swap(&ids[i],&ids[j]);
}
}
}
for(int i=0;i<m;i++){
std::cout <<ids[i]<<"\n";
}
delete []ids;
}
void swap(int *a,int *b)
{
int temp;
temp = *a;
*a = *b;
*b = temp;
return;
}
void search(int id,int calcCompID){
//ある人の後で部屋に入った人の数を数える処置
moveFlag[id]=true;
if(calcCompID>id){
sum+=backSums[id];
}else{
for(int i=0;i<m;i++){
if(g[id*m+i]==1 && moveFlag[i]==false){
sum++;
search(i,calcCompID);
}
}
}
}