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
に行って、
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 198 D - Send More Money
next_permutationを久しぶりに使った。
AtCoder Beginner Contest 198 E - Unique Color
木(グラフ)を作って、dfs。解説そのまま。