Pagini recente » Borderou de evaluare (job #2730907) | Cod sursa (job #460104) | Cod sursa (job #2114905) | Borderou de evaluare (job #1004063) | Cod sursa (job #1142702)
using namespace std;
#include<fstream>
#include<vector>
#include<utility>
#include<cstring>
#include<queue>
#include<map>
ifstream cin("pscnv.in");
ofstream cout("pscnv.out");
const int MAXN=300000;
map<pair<int,int>,int> mp;
vector<pair<int,int> > v[MAXN];
int ds[MAXN];
struct cmp{
bool operator()(const pair<int,int>& p1,const pair<int,int>& p2){
return p1.second>p2.second;
}
};
int main(){
int n,m,x,y;
cin>>n>>m>>x>>y;
cin.ignore();
for(int i=1;i<=m;i++){
int x,y,ps;
char a[100];
x=y=ps=0;
cin.getline(a,100);
unsigned j=0;
while(a[j]!=' '){
x=x*10+a[j]-'0';
j++;
}
j++;
while(a[j]!=' '){
y=y*10+a[j]-'0';
j++;
}
j++;
while(j<strlen(a)){
ps=ps*10+a[j]-'0';
j++;
}
if(x==y){
continue;
}
pair<int,int> pr;
pr.first=x;
pr.second=y;
if(mp.find(pr)==mp.end()){
mp[pr]=ps;
}else{
mp[pr]=min(ps,mp[pr]);
}
}
for(map<pair<int,int>,int>::iterator it=mp.begin();it!=mp.end();it++){
int x1,y1,cs;
x1=it->first.first;
y1=it->first.second;
cs=it->second;
v[x1].push_back(make_pair(y1,cs));
}
for(int i=1;i<=n;i++){
ds[i]=1<<30;
}
priority_queue <pair<int,int>, vector<pair<int,int> >, cmp> pq;
ds[x]=0;
pq.push(make_pair(x,0));
while(!pq.empty()){
int i=pq.top().first;
int pd=pq.top().second;
pq.pop();
for(unsigned j=0;j<v[i].size();j++){
int u=v[i][j].first;
int ps=v[i][j].second;
if(ds[u]>max(ps,pd)){
ds[u]=max(ps,pd);
pq.push(make_pair(u,ds[u]));
}
}
}
cout<<ds[y];
return 0;
}