题目1008:最短路径问题

来源:互联网 发布:linux history 清除 编辑:程序博客网 时间:2024/05/17 04:25

单源最短路径问题 Dijstra算法

贪心法  最优子结构

在求一点到另一点的最短距离时必须要确定该点到所有点的最短距离

优先队列 每次选出未遍历的权值最小的点


参考博客 http://www.cnblogs.com/dolphin0520/archive/2011/08/26/2155202.html


我的白痴代码:

#include <iostream>

#include <stdio.h>
#include <stdlib.h>
#include <limits.h>
using namespace std;
#define N 1024
#define M 1024
typedef struct node
{
    int n;
    int m;
}Graph;
int martrix[N][N];
int quanzhi[N][N];
void Dijstra(Graph g,int *dist,int *path,int *hff,int v)
{
    int i,j,k;
    int mins=INT_MAX;
    bool *visited = (bool*)malloc(sizeof(bool)*g.n);


    for(i=1;i<=g.n;i++)
    {
        if(i!=v&&martrix[v][i]>0)
        {
            path[i]=v;
            dist[i]=martrix[v][i];
            hff[i]=quanzhi[v][i];
        }
        else
        {
            path[i]=-1;
            dist[i]=mins;
            hff[i]=mins;
        }
        visited[i]=false;
        path[v]=v;
        dist[v]=0;
        hff[v]=0;
    }
    visited[v]=true;


    for(i=1;i<g.n;i++)
    {
        int u;
        int mis=INT_MAX;
        int hf=INT_MAX;
        for(j=1;j<=g.n;j++)     //寻找权值最小未被扩展的点
        {
            if(visited[j]==false&&dist[j]<mis)//找最小值
            {
                u=j;
                mis=dist[j];
                hf=hff[j];
            }
            if(visited[j]==false&&dist[j]==mis&&hff[j]<hf)//找最小值
            {
                u=j;
                hf=hff[j];
            }
        }
        visited[u]=true;
        for(k=1;k<=g.n;k++)
        {
            if(visited[k]==false&&martrix[u][k]>0&&martrix[u][k]+mis<dist[k])
            {
                dist[k]=martrix[u][k]+mis;
                path[k]=u;
                hff[k]=quanzhi[u][k]+hf;


            }
            if(visited[k]==false&&martrix[u][k]>0&&martrix[u][k]+mis==dist[k]&&hf+quanzhi[u][k]<hff[k])
            {
                path[k]=u;
                hff[k]=quanzhi[u][k]+hf;
            }
        }
    }
}
void showpath(Graph g,int *path,int vt,int v)
{
    /*int m=vt;
stack<int> s;
    while(m!=v)
    {
        s.push(m);
        m=path[m];
    }
    s.push(m);
    while(!s.empty())
    {
        cout<<s.top()<<" ";
        s.pop();
    }*/
    int mm=vt;
    int zhan[N];
    int op=0;
    while(mm!=v)
    {
        zhan[op++]=mm;
        mm=path[mm];
    }
    zhan[op++]=mm;
    op--;
    while(op>=0)
    {
        cout<<zhan[op--]<<" ";
    }
}
int main()
{
    int n,m;
    int a,b,d,p,s,t;
    Graph g;
    int *dist=(int*)malloc(sizeof(int)*M);
    int *path=(int*)malloc(sizeof(int)*M);
    int *hff=(int*)malloc(sizeof(int)*M);
    while(scanf("%d %d",&n,&m)!=EOF){
    if(n==0&&m==0) break;
    g.n=n;
    g.m=m;
    int i;
    for(i=0;i<m;i++)
    {
        scanf("%d %d %d %d",&a,&b,&d,&p);
        martrix[a][b]=d;
        quanzhi[a][b]=p;
    }
    scanf("%d %d",&s,&t);


    //cout<<"******************input finished*********\n";
    Dijstra(g,dist,path,hff,s);
    //showpath(g,path,t,s);
    cout<<dist[t]<<" "<<hff[t]<<endl;
    }
    return 0;
}
0 0
原创粉丝点击