O

来源:互联网 发布:木村秋则 知乎 编辑:程序博客网 时间:2024/04/29 14:48

Think:
1知识点:最短路_spfa()算法+前向星+判断负环
2反思:
1>题意理解能力需要提高
2>知识点理解不深入,需要多思考多应用
3>前向星需要加深理解

vjudge题目链接

建议参考博客题意理解

以下为Compilation Error错误——编译环境语言选择错误

Main.c:1:18: fatal error: cstdio: No such file or directory #include                   ^compilation terminated.

以下为Wrong Answer代码——数组开小了且自己对前向星知识点理解浅显导致入队判断条件错误且入队元素错误且判断负环错误

#include <cstdio>#include <cstring>#include <algorithm>#include <queue>using namespace std;const int inf = 0x3f3f3f3f;const int N = 1e2 + 4;const int M = 1e4 + 4;struct Edge{    int v;    int w;    int next;}edge[M];int n, m, cnt, head[N], dis[N], vis[N], lev[N], num[N];void add_edge(int u, int v, int c);void spfa(int x);int main(){    int T, k = 1, i, u, v, q, y;    scanf("%d", &T);    for(k = 1; k <= T; k++){        cnt = 0;        memset(head, -1, sizeof(head));        scanf("%d", &n);        for(i = 1; i <= n; i++){            scanf("%d", &lev[i]);        }        scanf("%d", &m);        for(i = 1; i <= m; i++){            scanf("%d %d", &u, &v);            add_edge(u, v, lev[v]-lev[u]);        }        spfa(1);        printf("Case %d:\n", k);        scanf("%d", &q);        for(i = 1; i <= q; i++){            scanf("%d", &y);            if(dis[y] == inf || dis[y] < 3 || num[y] > n)                printf("?\n");            else                printf("%d\n", dis[y]);        }    }    return 0;}void add_edge(int u, int v, int c){    edge[cnt].v = v;    edge[cnt].w = c*c*c;    edge[cnt].next = head[u];    head[u] = cnt++;}void spfa(int x){    queue <int> q;    while(!q.empty()){        q.pop();    }    memset(dis, inf, sizeof(dis));    memset(vis, 0, sizeof(vis));    memset(num, 0, sizeof(num));    dis[x] = 0, vis[x] = 1;    q.push(x);    num[x]++;    while(!q.empty()){        int t1 = q.front();        q.pop();        vis[t1] = 0;        for(int i = head[t1]; ~i; i = edge[i].next){            if(dis[t1] + edge[i].w < dis[edge[i].v]){                dis[edge[i].v] = dis[t1] + edge[i].w;                if((!vis[i]) && num[i] <= n){                    q.push(edge[i].v);                    num[i]++;                }            }        }    }}

以下为Time limit Exceeded代码——自己对前向星知识点理解浅显导致入队判断条件错误且入队元素错误且判断负环错误

#include <cstdio>#include <cstring>#include <algorithm>#include <queue>using namespace std;const int inf = 0x3f3f3f3f;const int N = 2e2 + 4;const int M = 1e4 + 4;struct Edge{    int v;    int w;    int next;}edge[M];int n, m, cnt, head[N], dis[N], vis[N], lev[N], num[N];void add_edge(int u, int v, int c);void spfa(int x);int main(){    int T, k = 1, i, u, v, q, y;    scanf("%d", &T);    for(k = 1; k <= T; k++){        cnt = 0;        memset(head, -1, sizeof(head));        scanf("%d", &n);        for(i = 1; i <= n; i++){            scanf("%d", &lev[i]);        }        scanf("%d", &m);        for(i = 1; i <= m; i++){            scanf("%d %d", &u, &v);            add_edge(u, v, lev[v]-lev[u]);        }        spfa(1);        printf("Case %d:\n", k);        scanf("%d", &q);        for(i = 1; i <= q; i++){            scanf("%d", &y);            if(dis[y] == inf || dis[y] < 3 || num[y] > n)                printf("?\n");            else                printf("%d\n", dis[y]);        }    }    return 0;}void add_edge(int u, int v, int c){    edge[cnt].v = v;    edge[cnt].w = c*c*c;    edge[cnt].next = head[u];    head[u] = cnt++;}void spfa(int x){    queue <int> q;    while(!q.empty()){        q.pop();    }    memset(dis, inf, sizeof(dis));    memset(vis, 0, sizeof(vis));    memset(num, 0, sizeof(num));    dis[x] = 0, vis[x] = 1;    q.push(x);    num[x]++;    while(!q.empty()){        int t1 = q.front();        q.pop();        vis[t1] = 0;        for(int i = head[t1]; ~i; i = edge[i].next){            if(dis[t1] + edge[i].w < dis[edge[i].v]){                dis[edge[i].v] = dis[t1] + edge[i].w;                if((!vis[i]) && num[i] <= n){                    q.push(edge[i].v);                    num[i]++;                }            }        }    }}

以下为Accepted代码

#include <cstdio>#include <cstring>#include <algorithm>#include <queue>using namespace std;const int inf = 0x3f3f3f3f;const int N = 2e2 + 4;const int M = 1e4 + 4;struct Edge{    int v;    int w;    int next;}edge[M];int n, m, cnt, head[N], dis[N], vis[N], lev[N], num[N];void add_edge(int u, int v, int c);void spfa(int x);int main(){    int T, k = 1, i, u, v, q, y;    scanf("%d", &T);    for(k = 1; k <= T; k++){        cnt = 0;        memset(head, -1, sizeof(head));        scanf("%d", &n);        for(i = 1; i <= n; i++){            scanf("%d", &lev[i]);        }        scanf("%d", &m);        for(i = 1; i <= m; i++){            scanf("%d %d", &u, &v);            add_edge(u, v, lev[v]-lev[u]);        }        spfa(1);        scanf("%d", &q);        printf("Case %d:\n", k);        for(i = 1; i <= q; i++){            scanf("%d", &y);            if(dis[y] == inf || dis[y] < 3 || num[y] > n)                printf("?\n");            else                printf("%d\n", dis[y]);        }    }    return 0;}void add_edge(int u, int v, int c){    edge[cnt].v = v;    edge[cnt].w = c*c*c;    edge[cnt].next = head[u];    head[u] = cnt++;}void spfa(int x){    queue <int> q;    while(!q.empty()){        q.pop();    }    memset(dis, inf, sizeof(dis));    memset(vis, 0, sizeof(vis));    memset(num, 0, sizeof(num));    dis[x] = 0, vis[x] = 1;    q.push(x);    num[x]++;    while(!q.empty()){        int t1 = q.front();        q.pop();        vis[t1] = 0;        for(int i = head[t1]; ~i; i = edge[i].next){            if(dis[t1] + edge[i].w < dis[edge[i].v]){                dis[edge[i].v] = dis[t1] + edge[i].w;                if((!vis[edge[i].v]) && num[edge[i].v] <= n){                    q.push(edge[i].v);                    num[edge[i].v]++;                }            }        }    }}
原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 奶瓶排气孔漏水怎么办 奶嘴排气孔漏水怎么办 bbox吸管杯漏水怎么办 四个月宝宝拉肚子怎么办 租的房子坐月子怎么办 榨果汁不甜怎么办 宝宝不会喝奶粉怎么办 两个月宝宝不长肉怎么办 打疫苗后发烧怎么办 孕期不爱吃水果怎么办 孕期很少吃水果怎么办 三个月小孩不吃奶粉怎么办 三个月宝宝偏瘦怎么办 破壁机打果汁有沫怎么办 宝宝7个月坐不稳怎么办 婴儿头睡偏了怎么办天 宝宝不爱趴着怎么办 宝宝喜欢竖着抱怎么办 婴儿抱习惯了怎么办 新生儿总让抱着放下就哭可怎么办 三个月宝宝认人怎么办 三个月的宝宝认生怎么办 一岁半宝宝尿黄怎么办 一岁多宝宝尿少怎么办 1岁宝宝一晚没尿怎么办 抗利尿激素少怎么办 小孩夜里尿多怎么办 一岁宝宝认生怎么办 婴儿一个月认生怎么办 婴儿大便带血丝怎么办 两个月宝宝认生怎么办 晚上宝宝认人怎么办 小孩长白头发怎么办 三个月婴儿脚力不足怎么办 未满月宝宝便秘怎么办 婴儿5天没拉大便怎么办 儿童三天没大便怎么办 婴儿4天没拉大便了怎么办 孩子不天天排便怎么办 宝宝便秘5天怎么办 小孩子3天便秘怎么办