题目:DD坐地铁:
题目:
样例:
输入:
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了
求改过!