寝癖頭の解法

学習中の覚え書きを投稿、更新していきます。

Aizu Online Judge in C++ #ALDS1_10_B : Matrix Chain Multiplication

Aizu Online Judge(AOJ)の過去問から、その提出コードの解答例です。

・問題 "Matrix Chain Multiplication"
https://onlinejudge.u-aizu.ac.jp/problems/ALDS1_10_B
・連鎖行列積

僕が作成、提出したコードは、以下のとおりです。

Aizu Online Judge in C++ #ALDS1_10_B : Matrix Chain Multiplication
/*
Aizu Online Judge in C++ #ALDS1_10_B : Matrix Chain Multiplication
https://onlinejudge.u-aizu.ac.jp/problems/ALDS1_10_B
 提出コードの解答例
 https://neguse-atama.hatenablog.com
*/
#include<bits/stdc++.h>
using namespace std;
int n,p[101],m[101][101];
int f(void){
    for(int i=1;i<=n;i++){
        m[i][i]=0;
    }
    for(int l=2;l<=n;l++){
        for(int i=1;i<=n-l+1;i++){
            int j=i+l-1;
            m[i][j]=1<<25;
            for(int k=i;k<=j-1;k++){
                m[i][j]=min(m[i][j],m[i][k]+m[k+1][j]+p[i-1]*p[k]*p[j]);
            }
        }
    }
    return m[1][n];
}
int main(void){
    cin>>n;
    for(int i=0;i<n;i++){
        cin>>p[i]>>p[i+1];
    }
    cout<<f()<<endl;
    return 0;
}

設問の出典は、プログラミング問題のオンライン採点システム「Aizu Online Judge(AOJ)」です。
http://judge.u-aizu.ac.jp/onlinejudge/




Aizu Online Judge in C++ #DSL_1_A : Disjoint Set: Union Find Tree

Aizu Online Judge(AOJ)の過去問から、その提出コードの解答例です。

・問題 "Disjoint Set: Union Find Tree"
https://onlinejudge.u-aizu.ac.jp/problems/DSL_1_A
・互いに素な集合

僕が作成、提出したコードは、以下のとおりです。

Aizu Online Judge in C++ #DSL_1_A : Disjoint Set: Union Find Tree
/*
Aizu Online Judge in C++ #DSL_1_A : Disjoint Set: Union Find Tree
https://onlinejudge.u-aizu.ac.jp/problems/DSL_1_A
 提出コードの解答例
 https://neguse-atama.hatenablog.com
*/
#include<bits/stdc++.h>
using namespace std;
const int num=10001;
int arr[num];
int find(int a){
    if(a==arr[a]){
        return a;
    }
    return find(arr[a]);
}
void unite(int a,int b){
    int fa=find(a);
    int fb=find(b);
    if(fa==fb){
        return;
    }else if(fa<fb){
        arr[fb]=arr[fa];
    }else{
        arr[fa]=arr[fb];
    }
}
int main(void){
    for(int i=0;i<num;i++){
        arr[i]=i;
    }
    int n,q;
    cin>>n>>q;
    for(int i=0;i<q;i++){
        int c,x,y;
        cin>>c>>x>>y;
        if(c==0){
            unite(x,y);
        }else{
            cout<<(find(x)==find(y))<<endl;
        }
    }
    return 0;
}

設問の出典は、プログラミング問題のオンライン採点システム「Aizu Online Judge(AOJ)」です。
http://judge.u-aizu.ac.jp/onlinejudge/




Aizu Online Judge in C++ #ALDS1_11_A ~ ALDS1_11_D

Aizu Online Judge(AOJ)の過去問から、その提出コードの解答例です。

Aizu Online Judge in C++ #ALDS1_11_A ~ ALDS1_11_D

僕が作成、提出したコードは、以下のとおりです。

・問題 "Graph"
https://onlinejudge.u-aizu.ac.jp/problems/ALDS1_11_A

/*
Aizu Online Judge in C++ #ALDS1_11_A : Graph
https://onlinejudge.u-aizu.ac.jp/problems/ALDS1_11_A
 提出コードの解答例
 https://neguse-atama.hatenablog.com
*/
#include<bits/stdc++.h>
using namespace std;
using ll=long long;
int main(void){
    ll n;
    cin>>n;
    vector<vector<ll>> g(n,vector<ll>(n,0));
    for(ll i=0;i<n;i++){
        int u,k;
        cin>>u>>k;
        for(ll j=0;j<k;j++){
            ll v;
            cin>>v;
            g[u-1][v-1]=1;
        }
    }
    for(int i=0;i<n;i++){
        for(int j=0;j<n;j++){
            cout<<g[i][j]<<((j==n-1) ? "\n" : " ");
        }
    }
    return 0;
}

・問題 "Depth First Search"
https://onlinejudge.u-aizu.ac.jp/problems/ALDS1_11_B

/*
Aizu Online Judge in C++ #ALDS1_11_B : Depth First Search
https://onlinejudge.u-aizu.ac.jp/problems/ALDS1_11_B
 提出コードの解答例
 https://neguse-atama.hatenablog.com
*/
#include<bits/stdc++.h>
using namespace std;
using ll=long long;
ll n;
bool tf[10005];
ll d[10005],f[10005];
vector<ll> g[10005];
ll num=0;
void DFS(ll i){
    tf[i]=true;
    num++;
    d[i]=num;
    for(ll j=0;j<g[i].size();j++){
        if(tf[g[i][j]]==false){
            DFS(g[i][j]);
        }
    }
    num++;
    f[i]=num;
}
void F(void){
    for(ll i=1;i<=n;i++){
        if(tf[i]==false){
            DFS(i);
        }
    }
    for(ll i=1;i<=n;i++){
        cout<<i<<" ";
        cout<<d[i]<<" ";
        cout<<f[i]<<endl;
    }
}
int main(void){
    cin>>n;
    ll u,k,v;
    for(ll i=1;i<=n;i++){
        cin>>u>>k;
        for(ll j=0;j<k;j++){
            cin>>v;
            g[u].push_back(v);
        }
    }
    F();
    return 0; 
}

・問題 "Breadth First Search"
https://onlinejudge.u-aizu.ac.jp/problems/ALDS1_11_C

/*
Aizu Online Judge in C++ #ALDS1_11_C : Breadth First Search
https://onlinejudge.u-aizu.ac.jp/problems/ALDS1_11_C
 提出コードの解答例
 https://neguse-atama.hatenablog.com
*/
#include<bits/stdc++.h>
using namespace std;
using ll=long long;
ll n;
ll g[101][101],d[101];
void BFS(void){
    bool tf[101];
    memset(d,-1,sizeof(d));
    memset(tf,false,sizeof(tf));
    d[0]=0;
    tf[0]=true;
    queue<ll> q;
    q.push(0);
    while(!(q.empty())){
        ll v=q.front();
        q.pop();
        for(ll i=0;i<n;i++){
            if(tf[i]==false && g[v][i]==1){
                tf[i]=true;
                d[i]=d[v]+1;
                q.push(i);
            }
        }
    }
}
int main(void){
    cin>>n;
    for(ll i=0;i<n;i++){
        ll u,k,v;
        cin>>u>>k;
        for(ll j=0;j<k;j++){
            cin>>v;
            g[u-1][v-1]=1;
        }
    }
    BFS();
    for(ll i=0;i<n;i++){
        cout<<i+1<<" "<<d[i]<<endl;
    }
    return 0;
}

・問題 "Connected Components"
https://onlinejudge.u-aizu.ac.jp/problems/ALDS1_11_D

/*
Aizu Online Judge in C++ #ALDS1_11_D : Connected Components
https://onlinejudge.u-aizu.ac.jp/problems/ALDS1_11_D
 提出コードの解答例
 https://neguse-atama.hatenablog.com
*/
#include<bits/stdc++.h>
using namespace std;
using ll=long long;
ll n,m;
vector<ll> v[100001];
ll s,t,id[100001];
bool tf[100001]={false};
void f(ll x,ll u){
    tf[x]=true;
    id[x]=u;
    ll num;
    for(ll i=0;i<v[x].size();i++){
        num=v[x][i];
        if(tf[num]==false){
            f(num,u);
        }
    }
}
int main(void){
    cin>>n>>m;
    ll a,b;
    for(ll i=0;i<m;i++){
        cin>>a>>b;
        v[a].push_back(b);
        v[b].push_back(a);
    }
    for(ll i=0;i<n;i++){
        if(tf[i]==false){
            f(i,i);
        }
    }
    ll q;
    cin>>q;
    for(ll i=0;i<q;i++){
        cin>>s>>t;
        if(id[s]==id[t]){
            cout<<"yes"<<endl;
        }else{
            cout<<"no"<<endl;
        }
    }
    return 0;
}

設問の出典は、プログラミング問題のオンライン採点システム「Aizu Online Judge(AOJ)」です。
http://judge.u-aizu.ac.jp/onlinejudge/