题解: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