题目描述
夕阳西下,匆匆忙忙间,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!!!”(无引号)若可以回家.
思路:裸的dijkstra,由于边比较多,可以用链式前向星+堆优化dijkstra模板。
#include<bits/stdc++.h>
#define INF 0x3f3f3f3f
#define ll long long
#define mem(ar,num) memset(ar,num,sizeof(ar))
#define me(ar) memset(ar,0,sizeof(ar))
#define lowbit(x) (x&(-x))
#define IOS ios::sync_with_stdio(false)
#define DEBUG cout<<endl<<"DEBUG"<<endl;
using namespace std;
const int MaxN = 100010, MaxM = 200000*2+5;
int head[MaxN], dis[MaxN], cnt,f,a,b,c;
bool vis[MaxN];
int n,m,s,t;
struct edge{
int to, dis, next;
}e[MaxM];
void add(int u, int v, int d){
e[++cnt].dis = d;
e[cnt].to = v;
e[cnt].next = head[u];
head[u] = cnt;
}
struct node{
int dis;
int pos;
bool operator <( const node &x )const{
return x.dis < dis;
}
};
priority_queue<node> q;
void dijkstra(){
dis[s]=0;
q.push((node){0,s});
while(!q.empty()){
node tmp = q.top();
q.pop();
int x = tmp.pos, d = tmp.dis;
if(vis[x])
continue;
vis[x] = 1;
int t=head[x];
while(t){
int y=e[t].to;
if(dis[y] > dis[x] + e[t].dis){
dis[y] = dis[x] + e[t].dis;
if(!vis[y]){
q.push((node){dis[y],y});
}
}
t=e[t].next;
}
}
}
int main(){IOS;
cin>>n>>m>>s>>t;//地图上n个地点,m条道路,SSJ在s处,他家在t处
memset(dis,0x3f,sizeof dis);
for(int i=0;i<m;i++){
cin>>f>>a>>b>>c;
if(f){
add(a,b,c);
add(b,a,c);
}
}
dijkstra();
if(dis[t]==INF){
cout<<"My gold"<<endl;
}else cout<<dis[t];
return 0;
}