1. 程式人生 > 其它 >7-2 迪傑斯特拉方法實現最短路徑

7-2 迪傑斯特拉方法實現最短路徑

用迪傑斯特拉演算法實現有向網的最短路徑
輸入格式:
第一行輸入有向網的頂點和邊數,第二行輸入各頂點值,用空格間隔,第三行開始輸入各條邊的 兩個點的及邊上的權值,用空格間隔。最後一行輸入要求路徑的兩個頂點。
輸出格式:
輸出最短路徑經過的各頂點,中間用-->連線。

include

include

include

using namespace std;
const int N=1010;

struct edge{
int v,w;
edge* next;
};
struct node{
int k;
edge* next;
}a[1010];
int n;

int find(int u){
for(int i=0;i<n;i++){
if(a[i].k==u){
return i;
}
}
return -1;
}

void add(int u,int v,int w){
edge* e=new edge();
e->v=v;
e->w=w;
e->next=a[u].next;
a[u].next=e;
}

int dis[N],pre[N];
bool st[N];

void dijkstra(int u){
memset(pre,-1,sizeof pre);
memset(dis,0x3f,sizeof dis);
dis[u]=0;
for(int i=0;i<n-1;i++){
int k=-1;
for(int j=0;j<n;j++){
if(st[j]0&&(k

-1||dis[j]<dis[k])){
k=j;
}
}
if(dis[k]==0x3f3f3f3f){
continue;
}
st[k]=1;
for(edge* j=a[k].next;j!=NULL;j=j->next){
int v=j->v,w=j->w;
if(dis[v]>dis[k]+w){
dis[v]=dis[k]+w;
pre[v]=k;
}
}
}
}

void showRoad(int v){
if(pre[v]!=-1){
showRoad(pre[v]);
cout<<"-->"<<a[v].k;
}else{
cout<<a[v].k;
}
}

int main(){
int m;
cin>>n>>m;

for(int i=0;i<n;i++){
    int k;
    cin>>k;
    a[i].k=k;
}

for(int i=0;i<m;i++){
    int u,v,w;
    cin>>u>>v>>w;
    int uu=find(u),vv=find(v);
    add(uu,vv,w);
}

int u,v;
cin>>u>>v;
dijkstra(u);

showRoad(v);

return 0;

}