0
点赞
收藏
分享

微信扫一扫

(第四天)4月27日算法学习

上善若水山西太原 2022-04-27 阅读 77
算法

今天把最短路都学完啦

 Dijkstral:

#include<bits/stdc++.h>
using namespace std;
int n, m, s, t, tot = 0 ;
int head[1020];
struct ty
{
    int t, l, next;
}edge[20010];
void addedge(int x,int y, int z)
{
    edge[++tot].l = z;
    edge[tot].t = y;
    edge[tot].next = head[x];
    head[x] = tot;
}
struct ty2
{
    int x, dis;
    bool operator < (const ty2 &a) const
    {
        return dis > a.dis;
    }
};
priority_queue<ty2> q;
int dis[1020];
bool vis[1020];
int dij(int s, int t)
{
    memset(dis, 0x3f, sizeof(dis));
    memset(vis, 0, sizeof(vis));
    dis[s] = 0;
    ty2 tmp;
    tmp.x = s, tmp.dis = 0;
    q.push(tmp);
    while(!q.empty())
    {
        ty2 tmp = q.top();
        q.pop();
        if (vis[tmp.x]) continue;
        vis[tmp.x] = 1;
        for (int i = head[tmp.x]; i != -1; i = edge[i].next)
        {
            int y = edge[i].t;
            if (vis[y]) continue;
            if (dis[y] > dis[tmp.x] + edge[i].l)
            {
                dis[y] = dis[tmp.x] + edge[i].l;
                ty2 tmp2;
                tmp2.x = y, tmp2.dis =dis[y];
                q.push(tmp2);
            }
        }
    }
    if (dis[t] >= 0x3f3f3f3f) return -1;
    return dis[t];
}

int main()
{
    scanf("%d%d%d%d", &n, &m, &s, &t);
    memset(head, -1, sizeof(head));
    for (int i = 1; i <= m; i++)
    {
        int x, y, z;
        scanf("%d%d%d", &x, &y, &z);
        addedge(x, y, z);
        addedge(y, x, z);
    }
    printf("%d\n", dij(s, t));
    return 0;
}

 Bellman-Ford算法

#include<bits/stdc++.h>
using namespace std;
int n, m, s, t, tot = 0 ;
int head[1020];
struct ty
{
    int t, l, next;
}edge[20010];
void addedge(int x,int y, int z)
{
    edge[++tot].l = z;
    edge[tot].t = y;
    edge[tot].next = head[x];
    head[x] = tot;
}
struct ty2
{
    int x, dis;
    bool operator < (const ty2 &a) const
    {
        return dis > a.dis;
    }
};
priority_queue<ty2> q;
int dis[1020];
bool vis[1020];
queue<int> q1;
int spfa(int s, int t)
{
    memset(dis, 0x3f, sizeof(dis));
    memset(vis, 0, sizeof(vis));
    dis[s] = 0;
    vis[s] = 1;
    q1.push(s);
    while(!q1.empty())
    {
        int x = q1.front();
        q1.pop();
        vis[x] = 0;
        for (int i = head[x]; i != -1; i= edge[i].next)
        {
            int y = edge[i].t;
            if (dis[y] > dis[x] + edge[i].l)
            {
                dis[y] = dis[x] + edge[i].l;
                if (!vis[y])
                {
                    q1.push(y);
                    vis[y] = 1;
                }
            }
        }
    }
    if (dis[t] >= 0x3f3f3f3f) return -1;
    return dis[t];
    
}

int main()
{
    scanf("%d%d%d%d", &n, &m, &s, &t);
    memset(head, -1, sizeof(head));
    for (int i = 1; i <= m; i++)
    {
        int x, y, z;
        scanf("%d%d%d", &x, &y, &z);
        addedge(x, y, z);
        addedge(y, x, z);
    }
    printf("%d\n", spfa(s, t));
    return 0;
}

今天晚上盲敲,敲了三遍终于敲对啦,特别开心。

明天继续加油!!!!!

举报

相关推荐

0 条评论