洛谷P1744 采购特价商品 链式前向星建图+spfa

spfa板子题

#include<iostream>
#include<queue>
#include<cmath>
#include<cstdio>
using namespace std;
const double inf=9999999;
int n,m,s,t;//s是起点,t是终点 
double dis[1005];
int top=0; 
struct pp
{
    int to,next;
    double w;//权值 
}a[50005];
int head[1005],book[1005];
double diss(int x1,int y1,int x2,int y2)
{
    return sqrt((double)(x1-x2)*(x1-x2)+(y1-y2)*(y1-y2));
}
void add(int from,int to,double w)//链式前向星建图 
{
    a[++top].next=head[from];
    a[top].w=w;
    a[top].to=to;//to到达的是顶点序号
    head[from]=top;//相当于一个链 
}
void spfa()
{
    for(int i=1;i<=105;i++)dis[i]=inf;
    queue<int>q;
    q.push(s);
    dis[s]=0;
    while(q.size())
    {
        int x=q.front();
        q.pop();book[x]=0;
        for(int i=head[x];i;i=a[i].next)//这里是边的序号 
        {
            int v=a[i].to;//v是到达的顶点的编号
            if(dis[v]>dis[x]+a[i].w)
            {
                dis[v]=dis[x]+a[i].w;
                if(book[v]==0)
                {
                    q.push(v);
                    book[v]=1;
                }
            }
        }
    }
}
void solve()
{
    cin>>n;
    int i;
    int x[105],y[105];
    for(i=1;i<=n;i++)cin>>x[i]>>y[i];
    cin>>m;
    for(i=1;i<=m;i++)
    {
        int aa,bb;
        cin>>aa>>bb;
        double cc=diss(x[aa],y[aa],x[bb],y[bb]);
        add(aa,bb,cc);
        add(bb,aa,cc);
    }
    cin>>s>>t;
    spfa();
    printf("%.2lf",dis[t]);
}
int main()
{
    solve();
}

猜你喜欢

转载自www.cnblogs.com/lyhhahaha/p/10029183.html