POJ-1797(dijkstra变形)

题目链接
题目大意:给了一个图,找出1到n的一条最小边权最大的路径.
一开始一直理解错题目了.以为是找最大边权最小的路径…WA的不省人事之后看了一下别人的题解.刚看完题目大意就懂了…顺利AC.
简单说一下这题的思路.
其实就是更改一下dij算法更新的思路.我们让dis[i]表示的是当前所有到达i的路径中.最小边权的最大值.什么情况下更新呢?
如果存在一个点j从j到i边权比最小边权还要大并且当前路径上面的最小值也比dis[i]要大的时候,就更新它.
具体实现看代码吧(虽然这个代码已经被某一题long long的范围魔改的很奇葩,但意思还是差不多)

#define LL long long
#define pb push_back
#define pii pair<LL,LL>
#include <iostream>
#include <algorithm>
#include <string.h>
#include <cmath>
#include <string>
#include <cstdio>
#include <set>
#include <vector>
#include <sstream>
#include <queue>
using namespace std;
const int N = 1e6+10;
const int mod = 998244353;
const LL INF = -(LL)pow(2,62)-1;
LL gcd(LL a, LL b) {return b == 0 ? a : gcd(b, a % b);}
LL xx[N],yy[N],zz[N];
LL head[N],nxt[N],to[N],from[N],len[N],dis[N];
LL cnt = 2,n,m,s,x,y,z;
bool vis[N];
void addedge(LL x,LL y,LL z){
	nxt[++cnt] = head[x];head[x] = cnt;from[cnt] = x;to[cnt] = y;len[cnt] = z;
}
inline int read() {
  int x=0, f=1; register char ch=getchar();
  for (; ch<'0' || ch>'9'; ch=getchar()) if (ch=='-') f=-1;
  for (; ch>='0' && ch<='9'; ch=getchar()) x=x*10+ch-'0';
  return x*f;
}

void init(){
	cnt = 2;
	memset(head,0,sizeof(head));
	memset(nxt,0,sizeof(nxt));
	memset(vis,0,sizeof(vis));
	for(int i=0;i<N;++i) dis[i] = INF;
}
void dij(){
	priority_queue<pii> q;
	q.push(make_pair(-INF, 1));
	while(!q.empty()){
		pii cur = q.top();
		q.pop();
		if(vis[cur.second]) continue;
		vis[cur.second] = 1;
		//dis[i]维护的是目前到达i点最大的代价.
		//first维护的是这条路径上面目前的最小值.
		for(int i=head[cur.second];i;i=nxt[i]){
			int tmp = to[i];
			if(len[i] > dis[tmp] && cur.first > dis[tmp]){
				q.push(make_pair(len[i]<cur.first?len[i]:cur.first,tmp));
				dis[tmp] = len[i]<cur.first?len[i]:cur.first;
			}
		}
	}
}
int ans1[N];
int main() {
    int t = read();
    int tot=1;
	while(t--){
		printf("Scenario #%d:\n",tot++);
		init();
		n = read();
		m = read();
		for(int i=1;i<=m;++i){
			xx[i] = read();
			yy[i] = read();
			zz[i] = read();
			addedge(xx[i],yy[i],zz[i]);
			addedge(yy[i],xx[i],zz[i]);
		}
		dij();
		cout << dis[n] << endl << endl;
	}

    return 0;
}

猜你喜欢

转载自blog.csdn.net/weixin_45590210/article/details/105047208