ちょっとした難問なのです、実力のある方判定をお願いします

フォーラム(掲示板)ルール
フォーラム(掲示板)ルールはこちら  ※コードを貼り付ける場合は [code][/code] で囲って下さい。詳しくはこちら
堀江伸一

ちょっとした難問なのです、実力のある方判定をお願いします

#1

投稿記事 by 堀江伸一 » 15年前

http://rose.u-aizu.ac.jp/onlinejudge/Pr ... 19&lang=jp
リンク先問題なのです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);
			}
		}
	}
}
必ずcodeタグで囲むようにお願いします。 by softya(ソフト屋)

“C言語何でも質問掲示板” へ戻る