1.今天解决了一个图论问题,一个二分问题.在图论问题中使用到最短路算法,但是实际上使用的是最短路的知识,使用二分进行查找然后维护长度实现计算大于x的路线是否存在.
include
include
include
include
include
const int N=1200;
using namespace std;
typedef pair<int,int>PII;
int n,p,k,a,b,c;
vector
int dis[N];
bool st[N];
bool bfs(int x){
int mon=0;
memset(st,0,sizeof st);
memset(dis,0x3f,sizeof dis);
priority_queue<PII,vector
q.push({0,1});
dis[1]=0;
int fl=0;
while(q.size()){
PII te=q.top();
int t=te.second;
int le=te.first;
q.pop();
if(st[t])continue;
st[t]=true;
// st[t]=false;
// cout<<"t = "<<t<<endl;
for(int i=0;i<pa[t].size();i++){
int d=pa[t][i].second>x?1:0;
if(!st[pa[t][i].first]&&dis[pa[t][i].first]>le+d){
dis[pa[t][i].first]=le+d;
q.push({le+d,pa[t][i].first});
}
}
}
// cout<<x<<" " <<dis[n]<<endl;
return dis[n]<=k;
}
int main(){
cin>>n>>p>>k;
int r=-1,l=0;
for(int i=0;i<p;i++){
cin>>a>>b>>c;
pa[a].push_back({b,c});
pa[b].push_back({a,c});
r=max(r,c);
// l=min(l,c);
}
int ne=r;
r++;
while(l<r){
int mid=l+r>>1;
// cout<<l<<" "<<r<<endl;
if(bfs(mid)){
r=mid;
}
else l=mid+1;
}
if(ne<l)cout<<-1;
else
cout<<l;
return 0;
}
以上是源码