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