最短路径题目

1797 Heavy Transportation.

//是最短路径的变形:每条路上的是容量,需要对dijkstra进行变形
//现在是:比较路径上载重量的大小,取小者,在所有的小的情况中取一个大的继续拓展

#include<iostream>
#include<cstring>
#include<cmath>
#include<algorithm>
#include<stack>
#include<cstdio>
#include<queue>
#include<map>
#include<vector>
#include<set>
using namespace std;
const int maxn=1010;
const int INF=0x3fffffff;
typedef long long LL;
//是最短路径的变形:每条路上的是容量,需要对dijkstra进行变形
//现在是:比较路径上载重量的大小,取小者,在所有的小的情况中取一个大的继续拓展
int n,m;
int dp[1010];
int vis[1010];
int mp[maxn][maxn];
void dij(int st){
	memset(vis,0,sizeof(vis[0])*(n+3));
	for(int i=1;i<=n;i++) dp[i]=mp[st][i];  //初始能够的容量
	dp[st]=1000000;
	vis[st]=1;
	for(int i=1;i<n;i++){
		int u=st,temp=0;
		for(int j=1;j<=n;j++){
			if(!vis[j]&&temp<=dp[j]){  //找到最大的
				temp=dp[j];
				u=j;
			}
		}
		vis[u]=1;
		if(dp[n]) return;
		for(int j=1;j<=n;j++){
			if(!vis[j]){
				dp[j]=max(dp[j],min(dp[u],mp[u][j])); //!!!!!!!!!注意这个
				//一种是不走u
				//一种是走u,但是这样就有限制,所以取小的
			}
		}
	}
}
int main(){
	int t;
	int ca=1;
	scanf("%d",&t);
	while(t--){
		scanf("%d %d",&n,&m);
		for(int i=1;i<=n;i++){
			memset(mp[i],0,sizeof(mp[i][0])*(n+3));
		}
		for(int i=0;i<m;i++){
			int x,y,wei;
			scanf("%d %d %d",&x,&y,&wei);
			mp[x][y]=mp[y][x]=max(wei,mp[x][y]);
		}
		dij(1);
		printf("Scenario #%d:\n",ca++);
		printf("%d\n\n",dp[n]);
	}
return 0;
}

  

 

原文地址:https://www.cnblogs.com/shirlybaby/p/12547580.html

时间: 2024-10-12 12:24:58

最短路径题目的相关文章

poj 最短路径题目总会

求最短路基本的算法:1>Dijkstra算法2>Bellman-Ford算法3>Floyd算法4>Floyd-Warshall算法5>Johnson算法6>A*算法题目: 1.poj1062 昂贵的聘礼(中等) 此题是个经典题目:用Dijkstra即可:但是其中的等级处理需要一定的技巧: 要理解好那个等级制度:这个处理好,基本就是裸体Dijkstra: 2 poj1125 Stockbroker Grapevine(基本) 这个是简单Floyd,需要求出的是每对顶点之间

最短路径问题分数: 3.5

时间限制:1 秒 内存限制:32 兆 特殊判题: 否 提交:62 解决: 28 标签 最短路径 题目描述 给你n个点,m条无向边,每条边都有长度d和花费p,给你起点s终点t,要求输出起点到终点的最短距离及其花费,如果最短距离有多条路线,则输出花费最少的. 输入格式 输入n,m,点的编号是1~n,然后是m行,每行4个数 a,b,d,p,表示a和b之间有一条边,且其长度为d,花费为p.最后一行是两个数 s,t;起点s,终点t.n和m为0时输入结束.(1<n<=1000, 0<m<100

1988:最短路径问题

时间限制:1 秒 内存限制:32 兆 特殊判题: 否 提交:72 解决: 30 标签 最短路径 题目描述 给你n个点,m条无向边,每条边都有长度d和花费p,给你起点s终点t,要求输出起点到终点的最短距离及其花费,如果最短距离有多条路线,则输出花费最少的. 输入格式 输入n,m,点的编号是1~n,然后是m行,每行4个数 a,b,d,p,表示a和b之间有一条边,且其长度为d,花费为p.最后一行是两个数 s,t;起点s,终点t.n和m为0时输入结束.(1<n<=1000, 0<m<100

poj1135

Domino Effect Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 10454   Accepted: 2590 Description Did you know that you can use domino bones for other things besides playing Dominoes? Take a number of dominoes and build a row by standing

POJ 3613 Cow Relays (Floyd + 矩阵快速幂 + 离散化 神题!)

Cow Relays Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 5611   Accepted: 2209 Description For their physical fitness program, N (2 ≤ N ≤ 1,000,000) cows have decided to run a relay race using the T (2 ≤ T ≤ 100) cow trails throughout

Light oj 1281 - New Traffic System 多状态最短路

题目大意:有向图,新计划的地铁,有k个计划新路,利用现有的铁路.k条新路和限定只能用d条新路,找出从0到n-1的最短路径 题目思路:用dist[u][use],储存使用use条新路,到达节点u的最短路径. #include<stdio.h> #include<string.h> #include<stdlib.h> #include<math.h> #include<iostream> #include<algorithm> #inc

Sicily 1031. Campus 解题报告

1031_Campus 题目链接: http://soj.me/1031 题目大意: 给出四个校区的一些地点之间的距离,地点名用字符串来表示,问某两个地点之间的最短路径长度,典型的单源最短路径题目 思路: 单源最短路径问题可以用dijkstra算法实现,这道题比较麻烦的是用字符串来表示地点,我用的处理方法是建立map得到地点名字到序号的映射,对于每个新输入的地点名字,先在map里面查找是否存在,如果不存在就绑定一个新的序号.地点之间的距离用邻接矩阵来存放. 代码: #include <iostr

【随便搞搞 1】 prim算法的学习和使用

最小生成树是图论中非常有用的算法. 就不知怎么的就学会的最小生成树~~ 但是最小生成树是什么呢? 标准定义如下:在边子集所构成的树中,不但包括了连通图里的所有顶点,且其所有边的权值之和亦为最小. 听起来非常的带劲,我们就一起来探讨这一求最小生成树的算法! prim 的四大特征: ●最小生成树算法中prim算法是耗时最长的 ●最小生成树算法中prim算法是适用于求稠密图的 ●最小生成树算法中prime算法最简单易懂 ●请不要多打一个e否则就是prime质数了 例子: P3366 [模板]最小生成树

北大ACM2387——Til the Cows Come Home

题目的意思是求解从路标N到路标1的最短路径,简单的最短路径题目,Dijkstra或者Bellman_Ford算法都可以过. 题目有一个坑:输入有重边,所以要选择最小的长度. 下面是AC的代码: #include <iostream> #include <cstdio> using namespace std; int cost[1005][1005]; bool vis[1005]; int dis[1005]; const int INF = 100000000; int N,