-
Notifications
You must be signed in to change notification settings - Fork 1
/
1423.cpp
148 lines (142 loc) · 3.14 KB
/
1423.cpp
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
#include <bits/stdc++.h>
using namespace std;
typedef struct vertice{
int val, peso;
char lugar; //c = castelo, v = vila
struct vertice *prox;
}Vertice;
typedef struct grafo
{
int v,e;
vertice *adj;
}Grafo;
Grafo* criaGrafo(int v)
{
Grafo *g = (Grafo*) malloc(sizeof(Grafo));
if (g!=NULL)
{
g->v = v;
g->e = 0;
g->adj = (vertice*)calloc(v,sizeof(vertice));
//todas as adjacencias estarao vazias neste momento
for (int i = 0; i <v; ++i)
{
g->adj[i].prox = NULL;
}
}
return g;
}
vertice* novoVertice(int v, int peso, int A)
{
vertice *novo = (vertice*)malloc(sizeof(vertice));
novo -> val = v;
novo -> peso = peso;
novo -> prox = NULL;
if(v < A) novo -> lugar = 'v';
else novo -> lugar = 'c';
return novo;
}
void insereAresta(Grafo *g, int v1, int v2,int peso, int A)
{
if(v1!=v2)//se nao for laco
{
vertice *p = g->adj[v1].prox;
while(p!=NULL)
{
if(p->val == v2) break; //verifica se o vertice ja esta ligado
p = p->prox;
}
/*se terminou de percorrer lista e não achou ocorrencia
do novo vertice, insere o vertice na lista
so verifica uma vez pois se trata de grafo simples
*/
if(p==NULL)
{
//insere novo vertice na adj de v1
vertice *novo = novoVertice(v2,peso,A);
novo->prox = g -> adj[v1].prox;
g->adj[v1].prox = novo;
g->e++;
//repete para v2
novo = novoVertice(v1,peso,A);
novo->prox = g->adj[v2].prox;
g->adj[v2].prox = novo;
}
}
}
void imprimeGrafo(Grafo *g)
{
int i;
vertice *w;
printf("\nGrafo com %d vertices e %d arestas\n",g -> v, g -> e );
for(i=0 ; i < g->v ; ++i)
{
// if(g->adj[i].val >= A) cout<<"\ncidade ";
// else cout<<"\nvila ";
cout <<"v"<<i+1;
w = g -> adj[i].prox;
while(w != NULL)
{
if(w->lugar == 'v')
cout<< "( "<<w->lugar <<" "<<w->val+1 <<"|"<<w->peso<<" )";
else
cout<< "( "<<w->lugar <<" "<<w->val +1 <<"|"<<w->peso<<" )";
w = w -> prox;
}
printf("¬\n");
}
}
int main()
{
int T,A,B,M,L,K,Xi,Yi,Li;
/* T = num casos de teste
A = vilas, B = castelos, M = ruas,
L = distancia possivel com bota, K = numero de usos da bota
Xi,Yi pra ligar os vertices, Li peso das arestas*/
Grafo *g;
priority_queue<pair<int, int>, vector<pair<int, int> >,greater<pair<int, int> > > Abertos; // dist[],city
//pi : predecessores, dist: distancia de v0, verificado: vertice ja foi verificado
int *pi, *dist, numVert;
cin >> T;
while(T--)
{
cin >> A >> B >> M >> L >> K;
numVert = A+B;
g = criaGrafo(numVert);
pi = (int*)calloc(numVert,sizeof(int));
dist = (int*)malloc(numVert* sizeof(int));
for (int i = 0; i < M; ++i)
{
if(i<numVert)
{
dist[i] = INT_MAX;
}
cin >> Xi >> Yi >> Li;
insereAresta(g,Xi-1,Yi-1,Li,A);
}
imprimeGrafo(g);
}
pi[0]--;
dist[0] = 0;
Abertos.push(make_pair(dist[0],0) );
int u,distU;
//dijkstra
while(Abertos.size()>0)
{
u = Abertos.top().second;
distU = Abertos.top().first;
Abertos.pop();
vertice *v = g->adj[u].prox;
while(v!= NULL)
{
if(distU + v->peso < dist[v->val])
{
dist[v->val] = distU + v->peso;
//insere os adjascentes a U na lista de prioridade minima
Abertos.push(make_pair(dist[v->val],v->val));
pi[v->val] = u;
}
v = v->prox;
}
}
}