トピックリンクhttps://www.luogu.com.cn/problem/P4408
分析
これは非常にナンセンスの束が、実際には、それがそうすることを、最終的には三点を求めるようにすることであると言って資格を与え、裸のように思える(\ AB + BC)\最小、感情的な理解モンゴルそれは、あなたが直径でエッジを持っている必要があり、またはいずれかに置き換え直径側は、他の点のスポット径までの距離を見つけるために、長径+への最終的な答えより良い答えを作ることができ、その後、画像の直径を見つけるために、完全な列挙直径が終了\(MAX(分(DIS1、DIS2を))\)、この質問は水の上にあると思われますか?
それは木ですのでので先輩の理論によれば、簡単に実行することができ、私はどのように書き込みを忘れ、DFS、および、すべての後、私はそれに慣れていないんだけど、遅すぎるヒットdijのを見て何spfa練習したいと思います本当に前に期待していませんでした。。。良い気分の証明明日、それを修正
#include<iostream>
#include<queue>
#define ll long long
using namespace std;
const int N=2e5+10;
struct Edge{
int to,nxt;
ll val;
}e[N<<1];
struct Node{
int id;ll val;
Node(){}
Node(int a,ll b){id=a,val=b;}
bool operator <(const Node&A)const {
return val>A.val;
}
};
int Head[N],len;
void Ins(int a,int b,ll c){
e[++len].to=b;e[len].val=c;
e[len].nxt=Head[a];Head[a]=len;
}
int n;bool inq[N];
ll dis1[N],dis2[N];
int dij(int s,ll dis[N]){
for(int i=1;i<=n;i++){
dis[i]=1e17;
inq[i]=0;
}
dis[s]=0;inq[s]=1;
priority_queue<Node> q;q.push(Node(s,0));
while(!q.empty()){
Node u=q.top();q.pop();inq[u.id]=0;
for(int i=Head[u.id];i;i=e[i].nxt){
int v=e[i].to;
if(inq[v])continue;
inq[v]=1;
if(dis[v]>dis[u.id]+e[i].val){
dis[v]=dis[u.id]+e[i].val;
q.push(Node(v,dis[v]));
}
}
}
ll Max=0;int id=0;
for(int i=1;i<=n;i++)
if(dis[i]>Max)Max=dis[i],id=i;
return id;
}
int main(){
ios::sync_with_stdio(false);
int m;
cin>>n>>m;
for(int i=1;i<=m;i++){
int a,b;ll c;
cin>>a>>b>>c;
Ins(a,b,c);Ins(b,a,c);
}
int a=dij(1,dis1);
int b=dij(a,dis2);
dij(b,dis1);
ll Max=0;
for(int i=1;i<=n;i++)
Max=max(Max,min(dis1[i],dis2[i]));
cout<<dis2[b]+Max;
}
私はなぜ知らないのmemsetの行く間違っを使用してLONGLONG配列:ヒント