牛客小白月賽10 D 飢餓(最短路)

題目傳送門

題目描述

夕陽西下,匆匆忙忙間,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

思路,就是n個點,m條路,0代表這條路不能走,1代表能走,求s到t的最短路,很裸的一道題,應該用dijkstra和spfa都能寫,這裏用spfa寫的,沒事好說的,spfa模板題。

#include<bits/stdc++.h>
const int N=1e6+10;
const int inf=0x3f3f3f3f;
using namespace std;
struct node{
	int to,cost,next;
}rode[N*2];
int head[N],vis[N],tol,dis[N],n,m,s,t,d;
int t1,t2,t3;
void add(int a,int b,int c){//鏈式前行星存圖
	rode[tol].to=b;
	rode[tol].cost=c;
	rode[tol].next=head[a];
	head[a]=tol++;
}
void spfa(){//spfa算法尋路
	queue<int>q;
	fill(dis,dis+N,inf);
	dis[s]=0;
	vis[s]=1;
	q.push(s);
	while(!q.empty()){
		int v=q.front();
		q.pop();
		vis[v]=0;
		for(int i=head[v];i!=-1;i=rode[i].next)
		{
			node e=rode[i];
			if(dis[e.to]>dis[v]+e.cost)
			{
				dis[e.to]=dis[v]+e.cost;
				if(!vis[e.to])
				{
					q.push(e.to);
					vis[e.to]=1;
				}
			}
		}
	}
}
int main()
{
      
	cin>>n>>m>>s>>t;
	memset(head,-1,sizeof head);
	tol=0;
	for(int i=1;i<=m;i++)
	{
		cin>>d>>t1>>t2>>t3;
		if(d)
		{
			add(t1,t2,t3);
			add(t2,t1,t3);
		}
	}
	spfa();
	 if(dis[t]!=inf)
         cout<<"My gold!!!"<<endl;
    else
	 cout<<dis[t]<<endl;
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章