Cod sursa(job #1252043)

Utilizator vlady1997Vlad Bucur vlady1997 Data 30 octombrie 2014 12:17:34
Problema Ciclu hamiltonian de cost minim Scor 25
Compilator cpp Status done
Runda Arhiva educationala Marime 1.95 kb
        #include <cstdio>
        #include <cstring>
        #include <vector>
        #define INF 1000000000
        using namespace std;
        struct ciclu
        {
            vector <int> nod;
            vector <int> cost;
        };
        ciclu g[1001];
        bool sel[1001];
        int q[1001], Min=INF, n, s=0;
        void dfs (int sursa, int x, int pas)
        {
            int i, y; q[pas]=x;
            if (x==sursa && pas==n+1)
            {
                if (s<Min) Min=s;
                return;
            }
            else if (pas>n+1) return;
            else
            {
                sel[x]=true;
                for (i=0; i<g[x].nod.size(); i++)
                {
                    y=g[x].nod[i];
                    if (sel[g[x].nod[i]]==false)
                    {
                        s+=g[x].cost[i];
                        dfs(sursa,y,pas+1);
                        sel[y]=false;
                    }
                    else if (g[x].nod[i]==sursa && pas==n)
                    {
                        s+=g[x].cost[i];
                        dfs(sursa,y,pas+1);
                        sel[y]=false;
                    }
                }
            }
        }
        int main()
        {
            int m, i, x, y, z;
            freopen("hamilton.in","r",stdin);
            freopen("hamilton.out","w",stdout);
            scanf("%d%d",&n,&m);
            for (i=1; i<=m; i++)
            {
                scanf("%d%d%d",&x,&y,&z);
                g[x].nod.push_back(y);
                g[x].cost.push_back(z);
            }
            for (i=0; i<n; i++)
            {
                memset(sel,0,sizeof(sel)); memset(q,0,sizeof(q)); s=0;
                dfs(i,i,1);
            }
            if (Min!=INF) printf("%d\n",Min);
            else printf("Nu exista solutie");
            fclose(stdin);
            fclose(stdout);
            return 0;
        }