虽然不是求最短路,但是仍然是最短路题目,题意是要求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