poj1797 最短路

虽然不是求最短路,但是仍然是最短路题目,题意是要求1到N点的一条路径,由于每一段路都是双向的并且有承受能力,求一条路最小承受能力最大,其实就是之前POJ2253的翻版,一个求最大值最小,一个求最小值最大,于是只要修改最短路的更新条件就可以直接跑模板了

dij:

 1 #include<stdio.h>
 2 #include<string.h>
 3 #include<vector>
 4 #include<algorithm>
 5 #include<queue>
 6 #define min(a,b) a<b?a:b
 7 const int INF=0x3f3f3f3f;
 8 using namespace std;
 9 typedef pair<int,int> pii;
10
11 struct cmp{
12     bool operator()(pii a,pii b){
13         return a.first<b.first;
14     }
15 };
16
17 int g[1005][1005],n,m,dist[1005];
18
19 void dij(int s,int p){
20     int i;
21     memset(dist,-1,sizeof(dist));
22     dist[s]=INF;
23     priority_queue<pii,vector<pii>,cmp>q;
24     q.push(make_pair(dist[s],s));
25     while(!q.empty()){
26         pii u=q.top();
27         q.pop();
28         if(u.first<dist[u.second])continue;
29         for(i=1;i<=n;i++){
30             if(~g[u.second][i]){
31                 int j=min(u.first,g[u.second][i]);
32                 if(dist[i]==-1||dist[i]<j){
33                     dist[i]=j;
34                     q.push(make_pair(dist[i],i));
35                 }
36             }
37         }
38     }
39     printf("%d\n\n",dist[p]);
40 }
41
42 int main(){
43     int t;
44     while(scanf("%d",&t)!=EOF){
45         for(int q=1;q<=t;q++){
46             int i;
47             memset(g,-1,sizeof(g));
48             scanf("%d%d",&n,&m);
49             for(i=1;i<=m;i++){
50                 int x,y,v;
51                 scanf("%d%d%d",&x,&y,&v);
52                 if(g[x][y]<v){
53                     g[x][y]=g[y][x]=v;
54                 }
55             }
56             printf("Scenario #%d:\n",q);
57             dij(1,n);
58         }
59     }
60     return 0;
61 }

dij

spfa:

 1 #include<stdio.h>
 2 #include<string.h>
 3 #include<queue>
 4 using namespace std;
 5 const int MAXM=1000;
 6 const int INF=0x3f3f3f3f;
 7
 8 int g[MAXM+5][MAXM+5],dist[MAXM+5],n,m;
 9 bool vis[MAXM+5];
10
11 void spfa(int s,int p){
12     int i;
13     memset(dist,-1,sizeof(dist));
14     dist[s]=INF;
15     memset(vis,0,sizeof(vis));
16     queue<int>q;
17     q.push(s);
18     vis[s]=1;
19     while(!q.empty()){
20         int u=q.front();
21         q.pop();
22         vis[u]=0;
23         for(i=1;i<=n;i++){
24             int t=dist[u]<g[u][i]?dist[u]:g[u][i];
25             if(i!=u&&g[u][i]!=-1&&dist[i]<t){
26                 dist[i]=t;
27                 if(!vis[i]){
28                     q.push(i);
29                     vis[i]=1;
30                 }
31             }
32         }
33     }
34     printf("%d\n\n",dist[p]);
35 }
36
37 int main(){
38     int t;
39     while(scanf("%d",&t)!=EOF){
40         for(int q=1;q<=t;q++){
41             int i;
42             scanf("%d%d",&n,&m);
43             memset(g,-1,sizeof(g));
44             for(i=1;i<=m;i++){
45                 int a,b,v;
46                 scanf("%d%d%d",&a,&b,&v);
47                 if(g[a][b]<v){
48                     g[a][b]=g[b][a]=v;
49                 }
50             }
51             printf("Scenario #%d:\n",q);
52             spfa(1,n);
53         }
54     }
55     return 0;
56 }

spfa

时间: 2024-10-16 23:48:45

poj1797 最短路的相关文章

poj1797 Heavy Transportation(最短路变形)

题目大意:有n个城市,m条道路,在每条道路上有一个承载量,现在要求从1到n城市最大承载量,而最大承载量就是从城市1到城市n所有通路上的最大承载量 解题思路:其实这个求最大边可以近似于求最短路,只要修改下找最短路更新的条件就可以了 #include <iostream> #include <cstring> #include <cstdio> using namespace std; const int maxn=1010; const int INF=0x3f3f3f3

poj1797(最短路小变形)

题目连接:http://poj.org/problem?id=1797 题意: 分析:dp[i]表示到达i点的过程中的最大承受重量,更新到i点时可能有多条路径,由优先队列堆出最大的那条即可. #include <cstdio> #include <cstring> #include <string> #include <cmath> #include <iostream> #include <algorithm> #include &

poj1797 - Heavy Transportation(最大边,最短路变形spfa)

题目大意: 给你以T, 代表T组测试数据,一个n代表有n个点, 一个m代表有m条边, 每条边有三个参数,a,b,c表示从a到b的这条路上最大的承受重量是c, 让你找出一条线路,要求这条线路上的最大的承重, 在所有其他线路最小. 题目分析: 这里只要将spfa进行一下变形就可以解决这问题了. 首先 我们的dist数组,起点位置要初始化为 INF, 其他位置初始化为 0 然后我们更新 dist 数组, 结果输出 dist[n]就行了 为什么这样写: 因为我们每次要找 所有路径中的最大边的最小一个,

hdu3461Marriage Match IV 最短路+最大流

//给一个图.给定起点和终点,仅仅能走图上的最短路 //问最多有多少种走的方法.每条路仅仅能走一次 //仅仅要将在最短路上的全部边的权值改为1.求一个最大流即可 #include<cstdio> #include<cstring> #include<iostream> #include<queue> #include<vector> using namespace std ; const int inf = 0x3f3f3f3f ; const

UESTC30-最短路-Floyd最短路、spfa+链式前向星建图

最短路 Time Limit: 3000/1000MS (Java/Others) Memory Limit: 65535/65535KB (Java/Others) 在每年的校赛里,所有进入决赛的同学都会获得一件很漂亮的T-shirt.但是每当我们的工作人员把上百件的衣服从商店运回到赛场的时候,却是非常累的!所以现在他们想要寻找最短的从商店到赛场的路线,你可以帮助他们吗? Input 输入包括多组数据. 每组数据第一行是两个整数NN ,MM (N≤100N≤100 ,M≤10000M≤1000

ACM: HDU 2544 最短路-Dijkstra算法

HDU 2544最短路 Time Limit:1000MS     Memory Limit:32768KB     64bit IO Format:%I64d & %I64u Description 在每年的校赛里,所有进入决赛的同学都会获得一件很漂亮的t-shirt.但是每当我们的工作人员把上百件的衣服从商店运回到赛场的时候,却是非常累的!所以现在他们想要寻找最短的从商店到赛场的路线,你可以帮助他们吗? Input 输入包括多组数据.每组数据第一行是两个整数N.M(N<=100,M<

ACM/ICPC 之 昂贵的聘礼-最短路解法(POJ1062)

//转移为最短路问题,枚举必经每一个不小于酋长等级的人的最短路 //Time:16Ms Memory:208K #include<iostream> #include<cstring> #include<cstdio> #include<cmath> #include<algorithm> using namespace std; #define INF 0x3f3f3f3f #define MAX 105 int lim, n; int p[M

图论(A*算法,K短路) :POJ 2449 Remmarguts&#39; Date

Remmarguts' Date Time Limit: 4000MS   Memory Limit: 65536K Total Submissions: 25216   Accepted: 6882 Description "Good man never makes girls wait or breaks an appointment!" said the mandarin duck father. Softly touching his little ducks' head, h

hdu4725 拆点+最短路

题意:有 n 个点,每个点有它所在的层数,最多有 n 层,相邻两层之间的点可以互相到达,消耗 c (但同一层并不能直接到达),然后还有一些额外的路径,可以在两点间互相到达,并且消耗一定费用.问 1 点到 n 点的最小花费 将每一层拆成两个点,分别为进入层和出发层,然后相邻层的出发层可以指向进入层,花费 c,每个点可以到达其出发层,而进入层可以到达该点,花费 0 ,最后建立其余双向边,最短路 1 #include<stdio.h> 2 #include<string.h> 3 #in