yokobuttonの不定期で競技プログラミングをするブログ

不定期で解けた競技プログラミングコンテストの問題を載せています。

windows10でのC++のプログラミング環境設定(mingw-w64+VSCode)

今回の記事はほとんど自分用です。

windows10でのC++のプログラミング環境の方法を載せます。

 

7-Zip.exeのダウンロードとインストール

圧縮・解凍ソフト7-Zipをダウンロードしてインストールします。(mingw64の解凍用です)

 

mingw-w64のダウンロードと解凍

mingw-w64のダウンロードページ

https://sourceforge.net/projects/mingw-w64/files/

に行って、インストーラではなくその下の

x86_64-win32-seh

をクリックして7zファイルをダウンロードします。

x86_64-8.1.0-release-win32-seh-rt_v6-rev0.7z」というファイルがダウンロードされるので、これを解凍します。

 

[2022/4/22:追記] 2022/4/22現在の最新バージョンのファイル

WinLibs standalone build of GCC and MinGW-w64 for Windows

https://winlibs.com/

に行って、

GCC 11.2.0 + MinGW-w64 10.0.0(UCRT)のWin64

7-Zip archive

をクリックして7zファイルをダウンロードします。

「winlibs-x86_64-posix-seh-gcc-11.2.0-mingw-w64ucrt-10.0.0-r1.7z」というファイルがダウンロードされるので、これを解凍します。

 

解凍したら、「mingw64」というファイルができるので、このファイルをC直下に移動させます。

 

VSCode(VisualStudioCode)のダウンロードとインストールおよび設定

VSCodeのダウンロードページへ行って、User Installerをダウンロードします。

https://azure.microsoft.com/ja-jp/products/visual-studio-code/

実行し、インストールします。

 

起動したら、左側にある「Extentions」で「C/C++」と「Japanese Language Pack for Visual Studio Code」をインストールします。再起動すると日本語環境になります。

 

「フォルダを開く」でソースコードを置くフォルダを開きます。

「新規ファイル」でファイルを作成し、「名前を付けて保存」で保存します。

簡単なプログラム(helloworldなど)を作成します。

 

上側にある「表示」の「コマンドパレット」から「C/C++:構成の編集(UI)」をクリックします。

コンパイラパスの欄に「C:\mingw64\bin\g++.exe」を入力します。

IntelliSenseモードを「windows-gcc-x64」に変更します。

 

[2022/4/24:追記] コンパイラ引数の追加

コンパイラ引数に

-static
-lstdc++
-lgcc
-lwinpthread

を入力すると、実行ファイルの実行の際に、システムエラーが出ずに、実行されます。

 

ビルドしたいファイル(先ほど作成したファイル)を表示した状態で

「コマンドパレット」から「タスク:既定のビルドタスクを構成する」をクリックします。

 

ビルドしたいファイルを表示した状態で上にある「ターミナル」から「ビルドタスクの実行」をクリックすると、「ファイル名.exe」の実行ファイルが作成されます。

 

実行はコマンドプロンプトでします。

「スタートメニュー」の「windowsシステムメニュー」に「コマンドプロンプト」があるので、クリックして実行します。cdコマンドで先ほど作成したフォルダに移動し、実行ファイルのファイル名を入力すると実行されます。

 

実行すると「libstdc++-6.dll」と「libgcc_s_seh-1.dll」が見つからないとシステムエラーが出るので、「mingw64」のフォルダから検索して、実行ファイルのあるフォルダにコピーします。

 

[2022/4/22:追記] 「libwinpthread-1.dll」の追加

GCC 11.2.0 + MinGW-w64 10.0.0(UCRT)の場合「libwinpthread-1.dll」も見つからないとシステムエラーが出るので、「mingw64」フォルダから検索して、実行ファイルのあるフォルダにコピーします。

 

これで無事にwindows10でC++のプログラミングができるようになりました。

 

 

 

 

 

 

 

 

 

 

グラフ同型性判定プログラム

グラフ同型性判定の本を読んで書いてみました。

その本自体にはプログラムは載っていなかったので、間違っているかも・・・。

ちなみにC++です。

 

入力はN頂点M辺のグラフG1、G2

出力は同型ならYes、そうではないならばNo

 

#include<iostream>
#include<vector>
#include<map>
#include<algorithm>

using namespace std;

int main(){
//G1,G2の作成
int N1 = 0, M1 = 0;
cin >> N1 >> M1;
vector< vector<int> > G1(N1);
for(int i = 0; i < M1; i++){
 int a = 0, b = 0;
 cin >> a >> b;
 G1[a].emplace_back(b);
 G1[b].emplace_back(a);
}
int N2 = 0, M2 = 0;
cin >> N2 >> M2;
vector< vector<int> > G2(N2);
for(int ii = 0; ii < M2; ii++){
 int a = 0, b = 0;
 cin >> a >> b;
 G2[a].emplace_back(b);
 G2[b].emplace_back(a);
}
for(int i = 0; i < G1.size(); i++){
sort(G1[i].begin(), G1[i].end());
}
for(int ii = 0; ii < G2.size(); ii++){
 sort(G2[ii].begin(), G2[ii].end());
}
/*
cout << "G1" <<endl;
for(int i = 0; i < G1.size(); i++){
 for(int j = 0; j < G1[i].size(); j++){
  cout << G1[i][j] << " ";
 }cout << endl;
}cout << endl;

cout << "G2" <<endl;
for(int ii = 0; ii < G2.size(); ii++){
 for(int jj = 0; jj < G2[ii].size(); jj++){
  cout << G2[ii][jj] << " ";
 }cout << endl;
}cout << endl;
*/
//全順列用の頂点集合の作成
vector<int> perm(N1, 0);
for(int i = 0; i < N1; i++){
 perm[i] = i;
}

//同型性チャック用
bool check = true;
map<int, int> mp;
do{
for(int i = 0; i < perm.size(); i++){
 mp[i] = perm[i];
}
//G2からG3を作成する
vector< vector<int> > G3(N2);
for(int ii = 0; ii < G2.size(); ii++){
 for(int jj = 0; jj < G2[ii].size(); jj++){
  int a = mp[ii];
  int b = mp[G2[ii][jj]];
  G3[a].emplace_back(b);
 }
}
for(int iii = 0; iii < G3.size(); iii++){
 sort(G3[iii].begin(), G3[iii].end());
}
/*
cout << "G3" <<endl;
for(int iii = 0; iii < G3.size(); iii++){
 for(int jjj = 0; jjj < G3[iii].size(); jjj++){
  cout << G3[iii][jjj] << " ";
 }cout << endl;
}cout << endl;
*/
//同型性チャック
//G1とG2が同型ならば
//G2から作ったG3のどれかはG1と同じ
check = true;
if(G1.size() == G3.size()){
 for(int i = 0; i < G1.size(); i++){
  if(check == false){
   break;
  }
  if(G1[i].size() == G3[i].size()){
  for(int j = 0; j < G1[i].size(); j++){
   if(check == false){
    break;
   }
  if(G1[i][j] == G3[i][j]){

  }else{
   check = false;
  }
 }
}else{
 check = false;
}
}
}else{
 check = false;
}
//全ての辺が同じならばcheckはtrueになっている。
if(check == true){
 break;
}
}while(next_permutation(perm.begin(), perm.end()));

if(check == true){
 cout << "Yes" << endl;
}else{
 cout << "No" << endl;
}

 return 0;
}

AtCoder Beginner Contest 197C-ORXORの問題

解説を見るとb it全探索と書いてあるので全探索でできると思い、再帰関数で書いてみたら通りました。

ソースコードAtCoder Beginner Contest 197のページのC問題、言語はC++、ユーザはyokobuttonで検索してください。