最短路算法——Dijkstra算法:

总感觉这个Dijkstra算法有DFS的味道,将边权全部记为无穷大,然后数据读入的话,更新边权(为了防止重复点的读入,可以取min,单向图的话,二维数组 i j 换一下连等)

这个要来两个题:
1:

德克萨斯纯朴的民眾们这个夏天正在遭受巨大的热浪!!!他们的德克萨斯长角牛吃起来不错,可是他们并不是很擅长生產富含奶油的乳製品。Farmer John 此时以先天下之忧而忧,后天下之乐而乐的精神,身先士卒地承担起向德克萨斯运送大量的营养冰凉的牛奶的重任,以减轻德克萨斯人忍受酷暑的痛苦。

FJ 已经研究过可以把牛奶从威斯康星运送到德克萨斯州的路线。这些路线包括起始点和终点先一共经过 T\ (1 \le T \le 2,500)T (1≤T≤2,500) 个城镇,方便地标号為 11 到 TT。除了起点和终点外地每个城镇由两条双向道路连向至少两个其它地城镇。每条道路有一个通过费用(包括油费,过路费等等)。

给定一个地图,包含 C\ (1 \le C \le 6,200)C (1≤C≤6,200) 条直接连接 22 个城镇的道路。每条道路由道路的起点 R_sRs​,终点 R_eRe​ (1 \le R_s,R_e \le T)(1≤Rs​,Re​≤T),和花费 C_i (1 \le C_i \le 1,000)Ci​(1≤Ci​≤1,000) 组成。求从起始的城镇 T_s\ (1 \le T_s \le T)Ts​ (1≤Ts​≤T) 到终点的城镇 T_e(1 \le T_e \le T)Te​(1≤Te​≤T) 最小的总费用。

输入格式

第 11 行:44 个由空格隔开的整数:T, C, T_s, T_eT,C,Ts​,Te​。

第 22 到第 C+1C+1 行:第 i+1i+1 行描述第 ii 条道路。有 33 个由空格隔开的整数:R_s, R_e,C_iRs​,Re​,Ci​。

输出格式

一个单独的整数表示从 T_sTs​ 到 T_eTe​ 的最小总费用。数据保证至少存在一条道路。

Sample Input

7 11 5 4
2 4 2
1 4 3
7 2 2
3 4 3
5 7 5
7 3 3
6 1 1
6 3 4
2 4 3
5 6 3
7 2 1

Sample Output

7
#include<bits/stdc++.h>
using namespace std; 
int t,g, n,m,a,b,c,dis[2010101],side[2600][2600];
void dijkstra(int num)//计算各点到num的距离 
{
	int vis[10005];
	for(int i=1;i<=n;i++)
	dis[i]=side[i][num];
	vis[num]=1;
	int minn,u;
	for(int i=1;i<n;i++)
	{
		minn=0x3f3f3f3f;
		for(int j=1;j<=n;j++)
		{
			if(!vis[j] && dis[j]<minn)
			{
				minn=dis[j];u=j;
			}
		}
		vis[u]=1;
		for(int j=1;j<=n;j++)
		{
			if(side[j][u]!=0x3f3f3f3f)
			{
				dis[j]=min(dis[j],dis[u]+side[j][u]);
			}
		}
	}
}

int main(){
	memset(side,0x3f,sizeof(side));
	cin>>n>>m>>t>>g;
	while(m--){
			cin>>a>>b>>c;
			side[a][b]=side[b][a]=min(side[a][b],c);
		}dijkstra(g);
		cout<<dis[t]<<endl;
	}

2.

链接:登录—专业IT笔试面试备考平台_牛客网
来源:牛客网
 

题目描述

P市有n个公交站,之间连接着m条道路。P市计划新开设一条公交线路,该线路从城市的东站(s点)修建到西站(t点),请为P市设计一条满足上述条件并且最短的公交线路图。

输入描述:

第一行有4个正整数n,m,s,t。

接下来m行,每行3个数a,b,v描述一条无向道路a——b,长度为v。

输出描述:

如果有解,输出一行,表示满足条件的最短公交线路的长度c。

否则,输出“-1”

示例1

输入

复制3 3 1 2 1 2 3 2 3 4 1 3 5

3 3 1 2
1 2 3
2 3 4
1 3 5

输出

复制3

3

示例2

输入

复制3 3 1 2 1 2 5 2 3 3 1 3 1

3 3 1 2
1 2 5
2 3 3
1 3 1

输出

复制4

4

示例3

输入

复制3 1 1 1 1 2 1

3 1 1 1
1 2 1

输出

复制0

0

备注:

对于100%的测试数据:
1 ≤ s,t ≤ n ≤ 1000
1 ≤ m ≤ 10000
1 ≤ 道路的长度 ≤ 10000

这题我RE了8发,最后将建图的side数组两个维换了一下就过了,咱也不清楚为什么,有无知道的小伙伴给我评论下 www:
 

#include<bits/stdc++.h>
using namespace std; 
int t,g, n,m,a,b,c,dis[2010101],side[2600][12600];
void dijkstra(int num)//计算各点到num的距离 
{
	int vis[10005];
	for(int i=1;i<=n;i++)
	dis[i]=side[i][num];
	vis[num]=1;
	int minn,u;
	for(int i=1;i<=n;i++)
	{
		minn=0x3f3f3f3f;
		for(int j=1;j<=n;j++)
		{
			if(!vis[j] && dis[j]<minn)
			{
				minn=dis[j];u=j;
			}
		}
		vis[u]=1;
		for(int j=1;j<=n;j++)
		{
			if(side[j][u]!=0x3f3f3f3f)
			{
				dis[j]=min(dis[j],side[j][u]);
			}
		}
	}
}

int main(){
	memset(side,0x3f,sizeof(side));
	cin>>n>>m>>t>>g;
	while(m--){
			cin>>a>>b>>c;
			side[a][b]=side[b][a]=min(side[a][b],c);
		}dijkstra(g);
        if(dis[t]==0x3f3f3f3f){
            cout<<-1<<endl;
        }else{
		cout<<dis[t]<<endl;}
	}

评论 8
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值