Sei sulla pagina 1di 7

package discretoclases;

import java.util.*;
public class DiscretoClases
{
public static void main(String[] args)
{
Matriz m;
int tam;
Scanner en=new Scanner(System.in);
System.out.println("Intro el tam:");
tam=en.nextInt();
System.out.println("Intro los valores de la matriz");
m=new Matriz(tam);
m.leer();
/*Matriz res=m.warshall();
for(int i=0;i<tam;i++)
{
for(int j=0;j<tam;j++)
System.out.print(res.getIJ(i, j)+" ");
System.out.println();
}*/
/*int a,b;
System.out.println("Intro el origen y el destino:");
a=en.nextInt();
b=en.nextInt();
System.out.println("el costo minimo es:"+m.getIJ(a, b)*2);//valido para matrices
simtricas
System.out.println("el costo minimo es:"+m.getIJ(a, b)+m.getIJ(b, a));//valido para
matrices asimtricas
* */
/*
System.out.println("Dijkstra");
int []dij=m.dijkstra(4);
for(int i=0;i<tam;i++)
System.out.print(dij[i]+" ");*/
System.out.println("adioosss");
int [][]ma=m.kruskal();
}
}
package discretoclases;
import java.util.*;
public class Matriz
{
int [][]map;
int n;
Scanner en;

public Matriz(int _n)


{
n=_n;
map=new int[n][n];
en=new Scanner(System.in);
//en=new *int[n];
//for(int i=0;i<n;i++)
//en[i]=new int[n];
}
public void leer()
{
for(int i=0;i<n;i++)
for(int j=0;j<n;j++)
map[i][j]=en.nextInt();//cin>>map[i][j];
}
public Matriz warshall()
{
Matriz map2=new Matriz(n);
for(int i=0;i<n;i++)
for(int j=0;j<n;j++)
map2.map[i][j]=map[i][j];
for(int i=0;i<n;i++)
for(int j=0;j<n;j++)
for(int k=0;k<n;k++)
{
if(map2.map[i][k]+map2.map[k][j]<map2.map[i][j])
map2.map[i][j]=map2.map[i][k]+map2.map[k][j];
}
return map2;
}
//devuelve el segundo costo mnimo
//desde cualquier nodo hacia cualquier nodo
public int[][] warshall2()
{
int [][]menor2=new int[n][n];
for(int i=0;i<n;i++)
for(int j=0;j<n;j++)
menor2[i][j]=map[i][j];
for(int i=0;i<n;i++)
for(int j=0;j<n;j++)
for(int k=0;k<n;k++)
{
if(map[i][k]+map[k][j]<map[i][j])
{
menor2[i][j]=map[i][j];

map[i][j]=map[i][k]+map[k][j];
}
}
return menor2;
}
public int getIJ(int a,int b)
{
return map[a][b];
}
public int[] dijkstra(int origen)
{
int INF=9999;
int total=0;
int []res=new int[n];
boolean []visitados=new boolean[n];
for(int i=0;i<n;i++)
{
res[i]=INF;
visitados[i]=false;
}
res[origen]=0;
do
{
//buscando el menor
int menor=INF,pos=-1;
for(int i=0;i<n;i++)
if(menor>res[i]&&visitados[i]==false)
{
menor=res[i];
pos=i;
}
visitados[pos]=true;
total++;
//recorrer la matriz
for(int i=0;i<n;i++)
{
int aux;
if(map[pos][i]!=INF)
{
aux=menor+map[pos][i];
if(aux<res[i])
res[i]=aux;
}
}
}while(total<n);
return res;
}

public int[][] kruskal()


{
int [][]res=new int[n][n];
int menor=Integer.MAX_VALUE;
int h=-1,p=-1;
int []aux=new int[n];
for(int i=0;i<n;i++)
aux[i]=-1;
int aux2=0;
do
{
menor=Integer.MAX_VALUE;
for(int i=0;i<n;i++)
{
for(int j=0;j<n;j++)
if(menor>map[i][j]&&aux[j]==-1)
{
h=j;
p=i;
menor=map[i][j];
}
}
aux[h]=p;
res[h][p]=menor;
res[p][h]=menor;
aux2++;
}while(aux2<n);
return res;
}
}
#include <iostream>
using namespace std;
#define INF 9999
int** inicializar(int n)
{
int **m;
m=new int*[n];
for(int i=0;i<n;i++)
m[i]=new int[n];
return m;
}
void menor(int &i,int &j,int **ma,int n)
{
int min=INF;
for(int ii=0;ii<n;ii++)
for(int jj=0;jj<n;jj++)
if(min>ma[ii][jj])
{
min=ma[ii][jj];

i=ii;
j=jj;
}
}
int** kruskal(int **ma,int n)
{
int aux[n],x,y,min;
int **res;
res=inicializar(n);
for(int i=0;i<n;i++)
{
aux[i]=i;
for(int j=0;j<n;j++)
res[i][j]=INF;
}
do
{
menor(x,y,ma,n);
min=ma[x][y];
res[y][x]=res[x][y]=min;
ma[y][x]=ma[x][y]=INF;
if(aux[x]!=aux[y])
{
int aux2=aux[y];
aux[y]=aux[x];
for(int i=0;i<n;i++)
if(aux[i]==aux2)
aux[i]=aux[x];
}
}while(min!=INF);
return res;
}
int subGConKruskal(int **ma,int n)
{
int c=0;
for(int i=0;i<n;i++)
for(int j=0;j<n;j++)
if(ma[i][j]!=INF)
c++;
c/=2;
return n-c;
}
int sumar(int **ma,int n)
{
int c=0;
for(int i=0;i<n;i++)
for(int j=0;j<n;j++)
if(ma[i][j]!=INF)
c+=ma[i][j];
c/=2;
return c;
}
void mostrar(int **ma,int n)
{
for(int i=0;i<n;i++)

for(int j=0;j<n;j++)
cout<<ma[i][j]<<endl;
}
int main()
{
int nodos,ejes,A;
cin>>nodos>>ejes>>A;
//int grafo[nodos][nodos];
int **grafo;
grafo=inicializar(nodos);
for(int i=0;i<nodos;i++)
for(int j=0;j<nodos;j++)
grafo[i][j]=INF;
for(int i=0;i<ejes;i++)
{
int x,y,c;
cin>>x>>y>>c;
x--;
y--;
grafo[x][y]=c;
grafo[y][x]=c;
}
//mostrar(grafo,nodos);
int **krus;
krus=inicializar(nodos);
krus=kruskal(grafo,nodos);
int cant=subGConKruskal(krus,nodos);
int s=sumar(krus,nodos);
cout<<"Costo total="<<s+A*cant;
cout<<"cantidad de A="<<cant;
return 0;
}
package reencuentroamigos;
import java.util.*;
public class ReencuentroAmigos
{
public static void main(String[] args)
{
Scanner en=new Scanner(System.in);
int tam=en.nextInt();
int x=en.nextInt();
int y=en.nextInt();
int z=en.nextInt();
Matriz m=new Matriz(tam);
m.leer();
int []vec1=m.dijkstra(x);
int []vec2=m.dijkstra(y);
int []vec3=m.dijkstra(z);
int []aux=new int[tam];
for(int i=0;i<tam;i++)
aux[i]=vec1[i]*10+vec2[i]*10+vec3[i]*10;

int menor=aux[0],pos=0;
for(int i=0;i<tam;i++)
if(aux[i]<menor)
{
menor=aux[i];
pos=i;
}
System.out.println(pos+" costo:"+menor);
/*for(int i=0;i<tam;i++)
{
for(int j=0;j<tam;j++)
System.out.print(((int)(Math.random()*100+1))+" ");
System.out.println();
}*/
}
}

Potrebbero piacerti anche