記錄刷題日常

元始天尊123發表於2024-09-18

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;
vectorpa[N];
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,greater>q;
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;
}
以上是原始碼

相關文章