Welcome, guest! Login / Register - Why register?
Psst.. new poll here.
Psst.. new forums here.
Microsoft is blocking us again (TY IP Reputation!) so just use oauth login instead. :)

Paste

Pasted as C++ by Jafc ( 13 years ago )
#include<iostream>
#include<cstdio>
#include<vector>
#include<algorithm>
#include <limits>
using namespace std;

const long long oo=numeric_limits<long long>::max();//infinito
long long G[1005][1005],cost[1005];
int q[1005],padre[1005],franja[1005];
long long ans;
int origen,n,m,cnt;

void inicializar(){
    cnt=1; ans=0;
    for(int i=0;i<1005;i++){
        for(int j=0;j<1005;j++){
            G[i][j]=oo;
        }
    }
}

void leer(){
    int m,a,b;
    long long c;
    int maxi=-1;
    scanf("%d",&n);
    for(int i=1;i<=n;i++){
        scanf("%d",&q[i]);
        if(q[i]>maxi){
            maxi=q[i];
            origen=i;
        }
    }
    scanf("%d",&m);
    for(int i=1;i<=m;i++){
        scanf("%d %d %d",&a,&b,&c);
        if(q[a]>q[b])G[a][b]=min(G[a][b],c);
    }
}

void prim(){
    int v;
    for(int i=1;i<=n;i++){
        padre[i]=-1;
        franja[i]=origen;
        cost[i]=G[origen][i];
    }
    padre[origen]=origen;
    while (1){
        long long MinCost=oo;
        for(int i=1;i<=n;i++){
            if(padre[i]==-1 and cost[i]<MinCost){
                MinCost=cost[v=i];
            }
        }
        if(MinCost==oo) break;
        padre[v] = franja[v];
        ans=ans+MinCost;
        cnt++;
        for(int i=1;i<=n;i++){
            if(padre[i]==-1 and G[v][i]<cost[i]){
                cost[i]=G[v][i];
                franja[i]=v;
            }
        }
    }
}
int main(){
    inicializar();
    leer();
    prim();
    if(cnt==n)printf("%d\n",ans);
    else printf("-1\n");
    return 0;
}

 

Revise this Paste

Your Name: Code Language: