因为n的上限太大了,如果用矩阵存储的话,需要非常大的内存。m上限是n上限的两倍,所以测试数据应该都是一些稀疏图。所以用vector存储比较划算。算法上我采用的是迪克斯特拉算法,没有优化的时候总超时。用堆优化一下。AC了。
#include<iostream>
#include<vector>
#include<algorithm>
#include<queue>
using namespace std;
#define maxn 100000+10
#define INF 0x3f3f3f3f
struct node
{
int v;
int d;
node(int a,int b):v(a),d(b){}
bool operator<(const node& n)const
{
return d>n.d;
//重载之后:d值大的优先级小。这样最大优先级队列每次取出的都是最小的d
}
};
struct dtn//记录与某点关联的点
{
int v,w;
dtn(int a,int b):v(a),w(b){}
};
vector<dtn> g[maxn];
priority_queue<node> q;
int d[maxn];
int vis[maxn];
int n,m;
void fun()
{
for(int i=2;i<=n;i++)d[i]=INF;
d[1]=0;
q.push(node(1,0));//将1加入T
while(!q.empty())
{
node t=q.top();
q.pop();
int v=t.v;
int dd=t.d;
if(vis[v])continue;
vis[v]=1;
for(int i=0;i<g[v].size();i++)
{
int tp=g[v][i].v;
int w=g[v][i].w;
int nd=max(w,dd);
if(nd<d[tp]){
d[tp]=nd;
q.push(node(tp,nd));//如果tp的d被更新了,tp相连的点d值也应该被更新
}
}
}
}
int main()
{
//freopen("D:\\1.txt","r",stdin);
cin>>n>>m;
for(int i=1;i<=m;i++)
{
getchar();
int a,b,c;
scanf("%d%d%d",&a,&b,&c);
g[a].push_back(dtn(b,c));
g[b].push_back(dtn(a,c));
}
fun();
cout<<d[n];
}