UVa 10596 - Morning Walk Solution

#include <iostream>
#include <vector>
#include <bitset>
using namespace std;
int n;
vector<vector<int> > a;
vector<int> deg;
bitset<200> vis;
int dfs(int u){
    if(vis[u])
        return 0;
    vis[u]=1;
    int ans=1;
    for(int i=0;i<n;i++)
        if(a[u][i]){
            a[u][i]--,a[i][u]--;
            ans+=dfs(i);
        }
    return ans;
}
int main(){
    while(ws(cin)&&!cin.eof()){
        int r;
        cin>>n>>r;
        a.assign(n,vector<int>(n));
        deg.assign(n,0);
        vis.reset();
        int x,y;
        for(int i=0;i<r;i++){
            cin>>x>>y;
            a[x][y]++;
            a[y][x]++;
            deg[x]++,deg[y]++,vis[x]=vis[y]=1;
        }
        int flag=0,df=vis.count();
        vis.reset();
        if(r==0)
            flag=1;
        else if(dfs(x)!=df)
            flag=1;
        else {
            for(int i=0;i<n;i++){
                if(deg[i]&1){
                    flag++;
                    break;
                }
            }
        }
        if(flag)
            cout<<"Not Possible"<<endl;
        else
            cout<<"Possible"<<endl;
    }
}

Comments