點的最短路徑

FLOYD

    for (int k=1;k<=n;k++)
        for (int i=1;i<=n;i++)
            for (int j=1;j<=n;j++)
                    if (f[i][j]>f[i][k]+f[k][j]) f[i][j]=f[i][k]+f[k][j];

dj

    memset(book,0,sizeof(book));
    memset(dis,127,sizeof(dis));
    dis[s]=0;
    while (true){
        int v=-1;
        for (int i=1;i<=n;i++){
            if (!book[i]&&(v==-1||dis[i]<dis[v])) v=i;
        }
        if (v==-1) break;
        book[v]=1;
        for (int i=1;i<=n;i++)
            dis[i]=min(dis[i],dis[v]+f[v][i]);
    }

‘DJ鄰接表+隊列優化’

#include<iostream>
#include<queue>
#include<cstring>
#include<cmath>
#include<cstdio>

using namespace std;

double f[1000][1000],dis[1010];
int n,m,s,t;

struct node{
    int x;
    int y;
}map[110];

struct edge {
    int to;
    double w;
};

vector<edge> g[500];

typedef pair<int, int> P;
double dist(node p1,node p2){
    return sqrt((p1.x-p2.x)*(p1.x-p2.x)+(p1.y-p2.y)*(p1.y-p2.y));
}

int main(){
    cin>>n;
    for (int i=1;i<=n;i++)  
        cin>>map[i].x>>map[i].y;
    cin>>m;

    for (int i=1;i<=m;i++){
        edge ed;    
        int x,y;
        cin>>x>>y;
        ed.to=y;
        ed.w=dist(map[x],map[y]);
        g[x].push_back(ed);
        ed.to=x;
        g[y].push_back(ed);     
    }

    cin>>s>>t;

    memset(dis,127,sizeof(dis));
    priority_queue<P,vector<P>,greater<P> > pq;
    dis[s]=0;
    pq.push(P(0,s));

    while (!pq.empty()){
        P tmp=pq.top();
        pq.pop();
        int v=tmp.second;
        if (dis[v]<tmp.first) continue;
        for (int i=0;i<g[v].size();i++){
            edge ed=g[v][i];
            if (dis[v]+ed.w<dis[ed.to]){
                dis[ed.to]=dis[v]+ed.w;
                pq.push(P(dis[ed.to],ed.to));
            }
        }

    }
    printf("%.2lf",dis[t]);
}

bellman-ford

#include<iostream>
#include<cstring>
#include<cmath>
#include<cstdio>
using namespace std;

const double INF = 10000000;
double dis[1010];
struct node{
    int x;
    int y;
}map[1100];

struct edge{
    int lai,qu;
    double w;
}ed[10100];
double dist(node p1,node p2){
    return sqrt((p1.x-p2.x)*(p1.x-p2.x)+(p1.y-p2.y)*(p1.y-p2.y));
}

int main(){
    int n,m;
    cin>>n;
    for (int i=1;i<=n;i++)  cin>>map[i].x>>map[i].y;
    cin>>m;
    int k=1;
    for (int i=1;i<=m;i++){
        int x,y;
        cin>>x>>y;
        ed[k].lai=x;
        ed[k].qu=y;
        ed[k].w=dist(map[x],map[y]);
        k++;
        ed[k].lai=y;
        ed[k].qu=x;
        ed[k].w=ed[k-1].w;
        k++;
    }
    int s,t;
    cin>>s>>t;
    fill(dis,dis+n+1,INF);
    dis[s]=0;
    while (true){
        bool book=false;
        for (int i=1;i<=2*m;i++){
            edge e=ed[i];
            if (dis[e.lai]!= INF &&dis[e.qu]>dis[e.lai]+e.w){
            dis[e.qu]=dis[e.lai]+e.w;
            book=true;
        }
    }
    if (!book) break;
    }
    printf("%.2lf",dis[t]);
}`
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章