Même si la question a une réponse acceptée valide, cette réponse résout le problème de mise en œuvre en fournissant un exemple de code de travail. Trouvez le code valide pour kième chemin le plus court ici:
// complexité Temps: O (V k (V * logV + E))
using namespace std;
typedef long long int ll;
typedef short int i16;
typedef unsigned long long int u64;
typedef unsigned int u32;
typedef unsigned short int u16;
typedef unsigned char u8;
const int N = 128;
struct edge
{
int to,w;
edge(){}
edge(int a, int b)
{
to=a;
w=b;
}
};
struct el
{
int vertex,cost;
el(){}
el(int a, int b)
{
vertex=a;
cost=b;
}
bool operator<(const el &a) const
{
return cost>a.cost;
}
};
priority_queue <el> pq;
vector <edge> v[N];
vector <int> dist[N];
int n,m,q;
void input()
{
int i,a,b,c;
for(i=0;i<N;i++)
v[i].clear();
for(i=1;i<=m;i++)
{
scanf("%d %d %d", &a, &b, &c);
a++;
b++;
v[a].push_back(edge(b,c));
v[b].push_back(edge(a,c));
}
}
void Dijkstra(int starting_node, int ending_node)
{
int i,current_distance;
el curr;
for(i=0;i<N;i++)
dist[i].clear();
while(!pq.empty())
pq.pop();
pq.push(el(starting_node,0));
while(!pq.empty())
{
curr=pq.top();
pq.pop();
if(dist[curr.vertex].size()==0)
dist[curr.vertex].push_back(curr.cost);
else if(dist[curr.vertex].back()!=curr.cost)
dist[curr.vertex].push_back(curr.cost);
if(dist[curr.vertex].size()>2)
continue;
for(i=0;i<v[curr.vertex].size();i++)
{
if(dist[v[curr.vertex][i].to].size()==2)
continue;
current_distance=v[curr.vertex][i].w+curr.cost;
pq.push(el(v[curr.vertex][i].to,current_distance));
}
}
if(dist[ending_node].size()<2)
printf("?\n");
else
printf("%d\n", dist[ending_node][1]);
}
void solve()
{
int i,a,b;
scanf("%d", &q);
for(i=1;i<=q;i++)
{
scanf("%d %d", &a, &b);
a++;
b++;
Dijkstra(a,b);
}
}
int main()
{
int i;
for(i=1;scanf("%d %d", &n, &m)!=EOF;i++)
{
input();
printf("Set #%d\n", i);
solve();
}
return 0;
}
http: //www.springerlink .com/content/pl0054nt2d0d2u3t/ –
Vous faites presque certainement référence au problème du chemin le plus court du k-ème, mais si vous êtes intéressé par les chemins disjoints, vous pouvez les trouver en utilisant l'algorithme d'Edmonds-Karp: http: // www .mat.uc.pt/~ eqvm/OPP/KSPP/KSPP.html – IVlad
Juste pour info: l'algorithme de Yen est pour quand vous envisagez seulement des chemins simples, alors que L'algorithme d'Eppstein est dans le cas où des chemins non simples sont autorisés (par exemple, les chemins sont autorisés à revisiter le même nœud plusieurs fois). Tangentiellement, si vous voulez le chemin * strictement * -second (je sais que vous avez indiqué le contraire), la version non-simple est dans P, la version simple non-orientée est dans P (Krasikov-Noble/Zhang-Nagamochi), et la La version simple est NP-difficile (Lalgudi-Papaefthymiou). Aussi, pour ce que ça vaut, je n'ai pas vu de très bonnes descriptions de l'algorithme de Yen, mais j'en aimerais une! – daveagp