蒟蒻尹 2022-06-11 16:51 采纳率: 50%
浏览 17
已结题

最短路WA了,求修改!

题目:DD坐地铁:
题目:

img

样例:
输入:

8 11
1 3 1
1 4 2
2 3 1
2 5 1
3 4 3
3 6 3
3 7 3
4 8 4
5 6 1
6 7 5
7 8 5

输出:

2

最短路代码:

#include<bits/stdc++.h>
#pragma GCC optimize(2)
using namespace std ;
const int N = 200010;

int n,m,que;
int cnt=0;
int xx,yy,zz;
struct {
    long long val;
    int pre;
} dis[N];
int last[N*2];
int s,t;
bool vis[N];
int minn=0;

struct Pic {
    int x,dist;
};

struct edge {
    int to,next;
    int value;
} e[N*2];

priority_queue<Pic> q;

void insert(int u,int v,int val) {
    e[++cnt].to=v;
    e[cnt].next=last[u];
    e[cnt].value=val;
    last[u]=cnt;
}

bool operator <(Pic a,Pic b) {
    return a.dist>b.dist;
}


int main() {
    cin>>n>>m;
    for(int i=1; i<=n; i++) dis[i].val=INT_MAX;
    for(int i=1; i<=m; i++) {
        scanf("%d%d%d",&xx,&yy,&zz);
        insert(xx,yy,zz);
        insert(yy,xx,zz);
    }
    Pic temp;
    temp.x=1;
    temp.dist=0;
    q.push(temp);
    dis[1].val=0;
    dis[1].pre-500;
    //Dj
    int tot=0;
    while(!q.empty()) {
        tot++;
        temp=q.top();
        q.pop();
        int now=temp.x;
        if(vis[now]) continue;
        vis[now]=1;
        for(int i=last[now]; i; i=e[i].next) {
            if(dis[now].pre!=e[i].value) {
                if(dis[now].val+1<dis[e[i].to].val) {
                    dis[e[i].to].val=dis[now].val+1;
                    dis[e[i].to].pre=e[i].value;
                    temp.dist=dis[e[i].to].val;
                    temp.x=e[i].to;
                    q.push(temp);
                }
            }
            if(dis[now].pre==e[i].value) {
                if(dis[e[i].to].val>dis[now].val) {
                    dis[e[i].to].val=dis[now].val;
                    dis[e[i].to].pre=e[i].value;
                    temp.dist=dis[e[i].to].val;
                    temp.x=e[i].to;
                    q.push(temp);
                }
            }
        }
    }
    if(dis[n].val==INT_MAX) puts("-1");
    else printf("%d",dis[n].val);
    return 0 ;
}

BFS+双端队列代码:

#include<bits/stdc++.h>
#pragma GCC optimize(2)
using namespace std ;
const int N = 200010;

int n,m,que;
int cnt=0;
int xx,yy,zz;
struct Dist {
    int id,dist;
} dis[N];
int last[N*2];
int s,t;
bool vis[N];
int minn=0;


struct edge {
    int to,next;
    int value;
} e[N*2];

struct node {
    int x,y;
    int id;
};

deque <int> q;

void insert(int u,int v,int val) {
    e[++cnt].to=v;
    e[cnt].next=last[u];
    e[cnt].value=val;
    last[u]=cnt;
}

void bfs() {
    q.push_front(1);
    while(q.size()) {
        int v=q.front();
        q.pop_front();
        if(vis[v]) continue;
        vis[v]=1;
        if(v==n) {
            cout<<dis[v].dist<<endl;
            return ;
        }
        for(int i=last[v]; i; i=e[i].next) {
            if(dis[v].id!=e[i].value) {
                if(dis[v].dist+1<dis[e[i].to].dist) {
                    dis[e[i].to].dist=dis[v].dist+1;
                    dis[e[i].to].id=e[i].value;
                    q.push_back(e[i].to);
                }
            }
            if(dis[v].id==e[i].value) {
                if(dis[v].dist<dis[e[i].to].dist) {
                    dis[e[i].to].dist=dis[v].dist;
                    dis[e[i].to].id=e[i].value;
                    q.push_front(e[i].to);
                }
            }
        }
    }
}

int main() {
    cin>>n>>m;
    for(int i=1; i<=n; i++) dis[i].dist=INT_MAX;
    for(int i=1; i<=m; i++) {
        scanf("%d%d%d",&xx,&yy,&zz);
        insert(xx,yy,zz);
        insert(yy,xx,zz);
    }
    dis[1].dist=0;
    dis[1].id=0;
    bfs();
    if(dis[n].dist==INT_MAX) puts("-1");
    return 0 ;
}
两种算法都WA了

img

求改过!

  • 写回答

0条回答 默认 最新

    报告相同问题?

    问题事件

    • 系统已结题 6月19日
    • 专家修改了标签 6月12日
    • 创建了问题 6月11日

    悬赏问题

    • ¥15 c#转安卓 java html
    • ¥15 os.listdir文件路径找不到
    • ¥15 使用gojs3.0,如何在nodeDataArray设置好text的位置,再go.TextBlock alignment中进行相应的改变
    • ¥15 psfusion图像融合指标很低
    • ¥15 银河麒麟linux系统如何修改/etc/hosts权限为777
    • ¥50 医院HIS系统代码、逻辑学习
    • ¥30 docker离线安装mysql报错,如何解决?
    • ¥15 构建工单的总账影响在哪里查询或修改
    • ¥15 三个简单项目写完之后有重赏之后联系我
    • ¥15 python报内存不能read错误