链接:https://www.nowcoder.com/acm/contest/136/I
来源:牛客网
P市有n个公交站,之间连接着m条道路。P市计划新开设一条公交线路,该线路从城市的东站(s点)修建到西站(t点),请为P市设计一条满足上述条件并且最短的公交线路图。
输入描述:
第一行有5个正整数n,m,s,t。 接下来m行,每行3个数a,b,v描述一条无向道路a——b,长度为v。
输出描述:
如果有解,输出一行,表示满足条件的最短公交线路的长度c。 否则,输出“-1”
示例1
输入
复制
3 3 1 2 1 2 3 2 3 4 1 3 5
输出
复制
3
示例2
输入
复制
3 3 1 2 1 2 5 2 3 3 1 3 1
输出
复制
4
示例3
输入
复制
3 1 1 1 1 2 1
输出
复制
0
这个题就很有意思了,一道简单的最短路,用floyd时候注意判重,其实floyd是过不去的,他数据比较水,才过去。
spfa算法:
#include<stdio.h> #include <algorithm> #include<string.h> #include<queue> using namespace std; const int maxn = 10000; const int inf = 0x3f3f3f3f; int d[maxn], cur[maxn], start, tend; struct node { int u, v, w, next; }edge[maxn*10]; int n, m, s, t, tot; int dis[maxn], head[maxn]; bool vis[maxn]; void init() { memset(head, -1, sizeof(head)); tot = 0; return; } void addedge(int u, int v, int w) { edge[tot].u = u; edge[tot].v = v; edge[tot].w = w; edge[tot].next = head[u]; head[u] = tot++; edge[tot].u = v; edge[tot].v = u; edge[tot].w = w; edge[tot].next = head[v]; head[v] = tot++; return; } void spfa(int st) { memset(vis, false, sizeof(vis)); memset(dis, inf, sizeof(dis)); queue<int>q; dis[st] = 0; vis[st] = true; q.push(st); while (!q.empty()) { int u = q.front(); q.pop(); vis[u] = false; for (int i = head[u]; i != -1; i = edge[i].next) { int v = edge[i].v; int w = edge[i].w; if (dis[v] > dis[u] + w) { dis[v] = dis[u] + w; if (!vis[v]) { vis[v] = true; q.push(v); } } } } } int main() { //freopen("C://input.txt", "r", stdin); scanf("%d%d%d%d", &n, &m, &s, &t); init(); for (int i = 0; i < m; i++) { int u, v, w; scanf("%d%d%d", &u, &v, &w); addedge(u, v, w); } spfa(s); if (dis[t] == inf) { printf("-1\n"); } else { printf("%d\n", dis[t]); } }
floyd算法:
#include<stdio.h> #include <algorithm> #include<string.h> #include<queue> using namespace std; const int maxn = 1005; const int inf = 0x3f3f3f3f; int n, m, s, t, tot; int mp[maxn][maxn]; int main() { //freopen("C://input.txt", "r", stdin); scanf("%d%d%d%d", &n, &m, &s, &t); memset(mp, inf, sizeof(mp)); for (int i = 0; i <= n; i++) { mp[i][i] = 0; } for (int i = 0; i < m; i++) { int u, v, w; scanf("%d%d%d", &u, &v, &w); mp[u][v] = min(mp[u][v],w); //判重 mp[v][u] = min(mp[v][u],w); } for (int k = 1; k <= n; k++) { for (int i = 1; i <= n; i++) { for (int j = 1; j <= n; j++) { if (mp[i][j] > mp[i][k] + mp[k][j]) { mp[i][j] = mp[i][k] + mp[k][j]; } } } } if (mp[s][t] == inf) { printf("-1\n"); } else { printf("%d\n", mp[s][t]); } }
牛客小白月赛6 I 公交路线
最新推荐文章于 2023-04-07 21:58:06 发布