#include <bits/stdc++.h>
using namespace std;
const int dmax=1e9+7;
struct node
{
unsigned dist[20];
unsigned from[20];
}graph[10];
struct comp
{
bool operator()(const pair<int,int> &a,const pair<int,int> &b)
{
return (a.second>b.second);
}
};
int main()
{
int ch=1,i,j,k,u,v,w,n,m,src;
vector<vector<pair<int,int> > > graph1;
vector<pair<pair<int,int>,int> > graph2;
if(ch==1) // Dijkstra's algorithm
{
priority_queue<pair<int,int>,vector<pair<int,int> >,comp> pq;
cin>>n>>m;
graph1.resize(n);
int dist[n];
bool vis[n];
for(i=1;i<=m;i++)
{
cin>>u>>v>>w;
graph1[u].push_back({v,w});
graph1[v].push_back({u,w});
graph2.push_back({{u,v},w});
}
cin>>src;
for(i=0;i<n;i++)
{
dist[i]=dmax;
vis[i]=0;
}
dist[src]=0;
pq.push({src,0});
while(!pq.empty())
{
u=pq.top().first;
pq.pop();
if(vis[u])
continue;
for(i=0;i<graph1[u].size();i++)
{
v=graph1[u][i].first;
w=graph1[u][i].second;
if(!vis[v] && dist[u]+w<dist[v])
{
dist[v]=dist[u]+w;
pq.push({v,dist[v]});
}
}
vis[u]=1;
}
cout<<"\nDijkstra's algorithm :\n";
for(i=0;i<n;i++)
cout<<dist[i]<<' ';
cout<<endl;
ch++;
}
if(ch==2) // Bellman Ford's algorithm
{
int dist[1003],flag=1,dmax=1e9+7;
for(i=0;i<n;i++)
dist[i]=dmax;
dist[src]=0;
cout<<"\n\nBellman Ford's algorithm :\n\n";
for(i=1;i<n;i++)
{
for(j=0;j<m;j++)
{
u=graph2[j].first.first;
v=graph2[j].first.second;
w=graph2[j].second;
if(dist[v]>dist[u]+w)
dist[v]=dist[u]+w;
for(k=0;k<n;k++)
cout<<dist[k]<<' ';
cout<<endl;
}
}
ch++;
}
int adjm[20][20],nodes=n,count=0,x,y;
int rp[20][20];
if(ch==3) // Distance Vector Routing Algorithm
{
cout<<"Distance Vector Routing algorithm :\n";
//printf("\nEnter the adjacency matrix :\n");
for(i=0;i<nodes;i++)
{
for(j=0;j<nodes;j++)
{
scanf("%d",&adjm[i][j]);
if(adjm[i][j]==1000)
rp[i][j]=-1;
else
rp[i][j]=adjm[i][j];
adjm[i][i]=0;
graph[i].dist[j]=adjm[i][j];
graph[i].from[j]=j;
}
}
do
{
count=0;
for(i=0;i<nodes;i++)
{
for(j=0;j<nodes;j++)
{
for(k=0;k<nodes;k++)
{
if(graph[i].dist[j]>adjm[i][k]+graph[k].dist[j])
{
graph[i].dist[j]=graph[i].dist[k]+graph[k].dist[j];
graph[i].from[j]=k;
count++;
}
}
}
}
}while(count!=0);
for(i=0;i<nodes;i++)
{
for(j=0;j<nodes;j++)
{
x=j;
y=graph[i].from[j];
while(x!=y)
{
x=y;
y=graph[i].from[x];
}
graph[i].from[j]=x;
}
}
for(i=0;i<nodes;i++)
{
printf("\n\nFor router %d\n",i);
for(j=0;j<nodes;j++)
printf("\t\nNode %d via %d Distance %d ",j,graph[i].from[j],graph[i].dist[j]);
}
ch++;
}
if(ch==4) // Linked State Routing algorithm
{
cout<<"\n\nLinked State Routing algorithm :\n\n";
for(i=0;i<nodes;i++)
{
printf("\n\nFor router %d\n",i);
for(j=0;j<nodes;j++)
{
if(rp[i][j]!=-1)
printf("\t\nNode %d via %d Distance %d ",j,graph[i].from[j],graph[i].dist[j]);
}
}
}
}
I2luY2x1ZGUgPGJpdHMvc3RkYysrLmg+CnVzaW5nIG5hbWVzcGFjZSBzdGQ7Cgpjb25zdCBpbnQgZG1heD0xZTkrNzsKCnN0cnVjdCBub2RlCnsKICAgIHVuc2lnbmVkIGRpc3RbMjBdOwogICAgdW5zaWduZWQgZnJvbVsyMF07Cn1ncmFwaFsxMF07CgpzdHJ1Y3QgY29tcAp7Cglib29sIG9wZXJhdG9yKCkoY29uc3QgcGFpcjxpbnQsaW50PiAmYSxjb25zdCBwYWlyPGludCxpbnQ+ICZiKQoJewoJCXJldHVybiAoYS5zZWNvbmQ+Yi5zZWNvbmQpOwoJfQp9OwoKaW50IG1haW4oKQp7CglpbnQgY2g9MSxpLGosayx1LHYsdyxuLG0sc3JjOwoJdmVjdG9yPHZlY3RvcjxwYWlyPGludCxpbnQ+ID4gPiBncmFwaDE7Cgl2ZWN0b3I8cGFpcjxwYWlyPGludCxpbnQ+LGludD4gPiBncmFwaDI7CglpZihjaD09MSkgLy8gRGlqa3N0cmEncyBhbGdvcml0aG0KCXsKCQlwcmlvcml0eV9xdWV1ZTxwYWlyPGludCxpbnQ+LHZlY3RvcjxwYWlyPGludCxpbnQ+ID4sY29tcD4gcHE7CgkJY2luPj5uPj5tOwoJCWdyYXBoMS5yZXNpemUobik7CgkJaW50IGRpc3Rbbl07CgkJYm9vbCB2aXNbbl07CgkJZm9yKGk9MTtpPD1tO2krKykKCQl7CgkJCWNpbj4+dT4+dj4+dzsKCQkJZ3JhcGgxW3VdLnB1c2hfYmFjayh7dix3fSk7CgkJCWdyYXBoMVt2XS5wdXNoX2JhY2soe3Usd30pOwoJCQlncmFwaDIucHVzaF9iYWNrKHt7dSx2fSx3fSk7CgkJfQoJCWNpbj4+c3JjOwoJCWZvcihpPTA7aTxuO2krKykKCQl7CgkJCWRpc3RbaV09ZG1heDsKCQkJdmlzW2ldPTA7CgkJfQoJCWRpc3Rbc3JjXT0wOwoJCXBxLnB1c2goe3NyYywwfSk7CgkJd2hpbGUoIXBxLmVtcHR5KCkpCgkJewoJCQl1PXBxLnRvcCgpLmZpcnN0OwoJCQlwcS5wb3AoKTsKCQkJaWYodmlzW3VdKQoJCQkJY29udGludWU7CgkJCWZvcihpPTA7aTxncmFwaDFbdV0uc2l6ZSgpO2krKykKCQkJewoJCQkJdj1ncmFwaDFbdV1baV0uZmlyc3Q7CgkJCQl3PWdyYXBoMVt1XVtpXS5zZWNvbmQ7CgkJCQlpZighdmlzW3ZdICYmIGRpc3RbdV0rdzxkaXN0W3ZdKQoJCQkJewoJCQkJCWRpc3Rbdl09ZGlzdFt1XSt3OwoJCQkJCXBxLnB1c2goe3YsZGlzdFt2XX0pOwoJCQkJfQoJCQl9CgkJCXZpc1t1XT0xOwoJCX0KCQljb3V0PDwiXG5EaWprc3RyYSdzIGFsZ29yaXRobSA6XG4iOwoJCWZvcihpPTA7aTxuO2krKykKCQkJY291dDw8ZGlzdFtpXTw8JyAnOwoJCWNvdXQ8PGVuZGw7CgkJY2grKzsKCX0KCWlmKGNoPT0yKSAvLyBCZWxsbWFuIEZvcmQncyBhbGdvcml0aG0KCXsKCQlpbnQgZGlzdFsxMDAzXSxmbGFnPTEsZG1heD0xZTkrNzsKCQlmb3IoaT0wO2k8bjtpKyspCgkJCWRpc3RbaV09ZG1heDsKCQlkaXN0W3NyY109MDsKCQljb3V0PDwiXG5cbkJlbGxtYW4gRm9yZCdzIGFsZ29yaXRobSA6XG5cbiI7CgkJZm9yKGk9MTtpPG47aSsrKQoJCXsKCQkJZm9yKGo9MDtqPG07aisrKQoJCQl7CgkJCQl1PWdyYXBoMltqXS5maXJzdC5maXJzdDsKCQkJCXY9Z3JhcGgyW2pdLmZpcnN0LnNlY29uZDsKCQkJCXc9Z3JhcGgyW2pdLnNlY29uZDsKCQkJCWlmKGRpc3Rbdl0+ZGlzdFt1XSt3KQoJCQkJCWRpc3Rbdl09ZGlzdFt1XSt3OwoJCQkJZm9yKGs9MDtrPG47aysrKQoJCQkJCWNvdXQ8PGRpc3Rba108PCcgJzsKCQkJCWNvdXQ8PGVuZGw7CgkJCX0KCQl9CgkJY2grKzsKCX0KCWludCBhZGptWzIwXVsyMF0sbm9kZXM9bixjb3VudD0wLHgseTsKCWludCBycFsyMF1bMjBdOwoJaWYoY2g9PTMpIC8vIERpc3RhbmNlIFZlY3RvciBSb3V0aW5nIEFsZ29yaXRobQoJewoJCWNvdXQ8PCJEaXN0YW5jZSBWZWN0b3IgUm91dGluZyBhbGdvcml0aG0gOlxuIjsKICAgIAkvL3ByaW50ZigiXG5FbnRlciB0aGUgYWRqYWNlbmN5IG1hdHJpeCA6XG4iKTsKICAgIAlmb3IoaT0wO2k8bm9kZXM7aSsrKQogICAgCXsKICAgICAgICAJZm9yKGo9MDtqPG5vZGVzO2orKykKICAgICAgICAJewogICAgICAgIAkJc2NhbmYoIiVkIiwmYWRqbVtpXVtqXSk7CiAgICAgICAgICAgIAlpZihhZGptW2ldW2pdPT0xMDAwKQogICAgICAgICAgICAJCXJwW2ldW2pdPS0xOwogICAgICAgICAgICAJZWxzZQogICAgICAgICAgICAJCXJwW2ldW2pdPWFkam1baV1bal07CiAgICAgICAgICAgIAlhZGptW2ldW2ldPTA7CiAgICAgICAgICAgIAlncmFwaFtpXS5kaXN0W2pdPWFkam1baV1bal07CiAgICAgICAgICAgIAlncmFwaFtpXS5mcm9tW2pdPWo7CiAgICAgICAgCX0KICAgIAl9CiAgICAJZG8KICAgIAl7CiAgICAgICAgCWNvdW50PTA7CiAgICAgICAgCWZvcihpPTA7aTxub2RlcztpKyspCiAgICAgICAgCXsKICAgICAgICAgICAgCWZvcihqPTA7ajxub2RlcztqKyspCiAgICAgICAgICAgIAl7CiAgICAgICAgICAgIAkJZm9yKGs9MDtrPG5vZGVzO2srKykKICAgICAgICAgICAgCQl7CiAgICAgICAgICAgICAgICAJCWlmKGdyYXBoW2ldLmRpc3Rbal0+YWRqbVtpXVtrXStncmFwaFtrXS5kaXN0W2pdKQogICAgICAgICAgICAgICAgCQl7CiAgICAgICAgICAgICAgICAgICAgCQlncmFwaFtpXS5kaXN0W2pdPWdyYXBoW2ldLmRpc3Rba10rZ3JhcGhba10uZGlzdFtqXTsKICAgICAgICAgICAgICAgICAgICAJCWdyYXBoW2ldLmZyb21bal09azsKICAgICAgICAgICAgICAgICAgICAJCWNvdW50Kys7CiAgICAgICAgICAgICAgICAJCX0KICAgICAgICAgICAgCQl9CiAgICAgICAgICAgIAl9CiAgICAgICAgCX0KICAgIAl9d2hpbGUoY291bnQhPTApOwogICAgCWZvcihpPTA7aTxub2RlcztpKyspCiAgICAJewogICAgCQlmb3Ioaj0wO2o8bm9kZXM7aisrKQogICAgCQl7CiAgICAJCQl4PWo7CgkJCQl5PWdyYXBoW2ldLmZyb21bal07CgkJCQl3aGlsZSh4IT15KQoJCQkJewoJCQkJCXg9eTsKCQkJCQl5PWdyYXBoW2ldLmZyb21beF07CgkJCQl9CgkJCQlncmFwaFtpXS5mcm9tW2pdPXg7CiAgICAJCX0KICAgIAl9CiAgICAJZm9yKGk9MDtpPG5vZGVzO2krKykKICAgIAl7CiAgICAgICAgCXByaW50ZigiXG5cbkZvciByb3V0ZXIgJWRcbiIsaSk7CiAgICAgICAgCWZvcihqPTA7ajxub2RlcztqKyspCiAgICAgICAgICAgIAlwcmludGYoIlx0XG5Ob2RlICVkIHZpYSAlZCBEaXN0YW5jZSAlZCAiLGosZ3JhcGhbaV0uZnJvbVtqXSxncmFwaFtpXS5kaXN0W2pdKTsKICAgIAl9CiAgICAJY2grKzsKCX0KCWlmKGNoPT00KSAvLyBMaW5rZWQgU3RhdGUgUm91dGluZyBhbGdvcml0aG0KCXsKICAgIAljb3V0PDwiXG5cbkxpbmtlZCBTdGF0ZSBSb3V0aW5nIGFsZ29yaXRobSA6XG5cbiI7CiAgICAJZm9yKGk9MDtpPG5vZGVzO2krKykKICAgIAl7CiAgICAgICAgCXByaW50ZigiXG5cbkZvciByb3V0ZXIgJWRcbiIsaSk7CiAgICAgICAgCWZvcihqPTA7ajxub2RlcztqKyspCiAgICAgICAgCXsKICAgIAkJCWlmKHJwW2ldW2pdIT0tMSkKICAgICAgICAgICAgCQlwcmludGYoIlx0XG5Ob2RlICVkIHZpYSAlZCBEaXN0YW5jZSAlZCAiLGosZ3JhcGhbaV0uZnJvbVtqXSxncmFwaFtpXS5kaXN0W2pdKTsKICAgICAgICAJfQogICAgCX0KCX0KfQ==