列表

详情


NC20905. 饥饿

描述

夕阳西下,匆匆忙忙间,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

原站题解

上次编辑到这里,代码来自缓存 点击恢复默认模板

C++11(clang++ 3.9) 解法, 执行用时: 139ms, 内存消耗: 2404K, 提交时间: 2020-04-10 12:29:11

#include<bits/stdc++.h>
using namespace std;
const int M = 2e5+10;
const int INF=999999;
int n,m,s,t,tot;
int dis[M];
int u[M],v[M],w[M];
int dijkstra(int s,int t){
	for(int i=0;i<=n;i++)
	dis[i]=INF;
	dis[s]=0;
	bool f;
	for(int i=0;i<n;i++){
		f=1;
		for(int j=0;j<tot;j++){
			if(dis[v[j]]!=INF&&dis[u[j]]>dis[v[j]]+w[j])
			dis[u[j]] = dis[v[j]]+w[j],f=0;
		}
		if(f) break;
	}
	if(dis[t]!=INF) return dis[t];
	return 0;
}
int main(){
	cin>>n>>m>>s>>t;
	tot=0;
	int p,x,y,z;
	for(int i=0;i<m;i++){
		cin>>p>>x>>y>>z;
		if(p){
			u[tot]=x,v[tot]=y,w[tot]=z;
			tot++;
			u[tot]=y,v[tot]=x,w[tot]=z;
			tot++;
		}
	}
	if(!dijkstra(s,t))
	cout<<"My gold!!!"<<endl;
	else
	cout<<dijkstra(s,t)<<endl;
	return 0;
}

C++14(g++5.4) 解法, 执行用时: 188ms, 内存消耗: 7832K, 提交时间: 2020-04-11 15:47:04

#include<bits/stdc++.h>
using namespace std;
const int maxn=999999;
int dis[maxn];
int u[maxn],v[maxn],w[maxn];
int main()
{
    int n,m,s,t;
    int a,b,c,d;
    int l=1;
    cin>>n>>m>>s>>t;
    for (int i=1;i<=m;i++){
        cin>>d>>a>>b>>c;
        if(d)
        {
            u[l]=a,v[l]=b,w[l]=c;
            l++;
            u[l]=b,v[l]=a,w[l]=c;
            l++;
        }
    }
    memset(dis,maxn,sizeof(dis));
    dis[s]=0;
    while (m--)
    {
    	int f=1;
        for (int i=1;i<l;i++){
            if(dis[v[i]]>dis[u[i]]+w[i])
                dis[v[i]]=dis[u[i]]+w[i],f=0;
        }
        if(f) break;
    }
    if (dis[t]==maxn)cout <<"My gold!!!";
    else cout<<dis[t];
    return 0;
}

上一题