今天把最短路都学完啦
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;
}
今天晚上盲敲,敲了三遍终于敲对啦,特别开心。
明天继续加油!!!!!