题解:B zi题,是1代表可以存边,此路无疯狗,需要注意的是邻接表存边,临界数组放不下。
代码,
#include<cstdio>
#include<algorithm>
#include<queue>
#include<cstring>
#include<iostream>
using namespace std;
#define int long long
const int maxn=1000005;
const int inf=0x3f3f3f3f;
struct Edge{
int v,w;//w为距离
int next;
};
Edge edge[maxn];//边编号 从1开始
struct qnode{ //堆优化
int u; //起点
int w;//距离
qnode(int u=0,int w=0):u(u),w(w){}
bool operator < (const qnode& a) const{
return w>a.w;
}
};
int dis[maxn];
int head[maxn];
bool vis[maxn];
int x[maxn],y[maxn],z[maxn];
int n,m,s,t;
int size;
void add_edge(int u,int v,int w){//邻接表加边
edge[size].v=v;
edge[size].w=w;
edge[size].next=head[u];
head[u]=size;
size++;
}
void dijkstra(int s){
priority_queue<qnode>q;
while(!q.empty())
q.pop();
q.push(qnode(s,0));
dis[s]=0;
while(!q.empty()){
qnode t=q.top();
q.pop();
int u=t.u;
if(vis[u])continue;
vis[u]=true;
for(int i=head[u];i!=-1;i=edge[i].next){
int v=edge[i].v;
int w=edge[i].w;
if(!vis[v]&&dis[v]>dis[u]+w){
dis[v]=dis[u]+w;
q.push(qnode(v,dis[v]));
}
}
}
}
signed main(){
size=1;
scanf("%d%d%d%d",&n,&m,&s,&t);
for(int i=1;i<=n;i++){//初始化
head[i]=-1;
dis[i]=inf;
vis[i]=false;
}
for(int i=1;i<=m;i++){
int x;
cin>>x;
int aa,bb,cc;
cin>>aa>>bb>>cc;
if(x==1){
add_edge(aa,bb,cc);
add_edge(bb,aa,cc);
}
}
dijkstra(s);
int ans=dis[t];
printf("%d\n",ans);
return 0;
}
题目描述
夕阳西下,匆匆忙忙间,SSJ一天的课程已经全部上完了,肚子咕咕开始叫了,坐上回家的公交车,可是SSJ今天好像有点迷,据说今中午吃饭时没去食堂,走着走着,外边景色好美啊,啊?我好像没走过这,完了,我好想迷路了。
公交车到了终点站,SSJ下车了,内心无比紧张,回不去了,一阵冷风吹过,瑟瑟发抖,emm...,那是一张地图?地图上有啥大家都明白,SSJ现在已经饿得无力思考了,请你帮他设计一条最快回家的路下,他要快点回家吃xxx。
输入描述:
第一行四个数n,m,s,t。(分别表示有地图上n个地点,m条道路,SSJ在s处,他家在t处)第2-m+1三个正整数,f,u(某条路起点),v(到达点),w(路径距离)。(f为1或0,0表示这条道路上有恶狗拦路,SSJ已无力与恶狗打斗了,所以他要避开这些道路,1表示此条道路无危险)。
输出描述:
第一行一个数表示最短路径长度,若无法回家输出“My gold!!!”(无引号)若可以回家.
示例1
输入
复制
5 7 1 5 0 1 4 4 1 1 3 2 1 1 5 7 1 2 5 10 0 2 3 1 1 3 5 2 1 4 3 7
输出
复制
4
备注:
n≤10000,m≤200000,w≤5000000