1 solutions
-
0
C++ :
#include<cstdio> #include<queue> #include<cstring> #define MAXK 10001 #define MAXN 1001 #define INF 10000001 using namespace std; struct edge{ int to; int data; int next; }e[MAXK<<1]; int n,p,k,len,g[MAXN],dis[MAXN]; bool v[MAXN]; queue<int> q; void make_edge(int x,int y,int data){ len++; e[len].to=y; e[len].data=data; e[len].next=g[x]; g[x]=len; return; } bool SPFA(int); int main(){ scanf("%d%d%d",&n,&p,&k); for(int i=1;i<=p;i++){ int x,y,l; scanf("%d%d%d",&x,&y,&l); make_edge(x,y,l); make_edge(y,x,l); } int l=0,r=INF,ans=INF; while(l<=r){ int mid=(l+r)>>1; bool flag=SPFA(mid); if(flag){ if(ans>mid) ans=mid; r=mid-1; } else l=mid+1; } if(ans==INF) ans=-1; printf("%d\n",ans); return 0; } bool SPFA(int lim){ memset(dis,0x7f,sizeof(dis)); memset(v,0,sizeof(v)); v[1]=1; dis[1]=0; q.push(1); while(!q.empty()){ int k=q.front(); v[k]=0; q.pop(); for(int i=g[k];i!=0;i=e[i].next){ int y=e[i].to,val=e[i].data; int add=0; if(val>lim) add=1; if(dis[y]>dis[k]+add){ dis[y]=dis[k]+add; if(!v[y]){ v[y]=1; q.push(y); } } } } if(dis[n]<=k) return 1; return 0; }
- 1
Information
- ID
- 714
- Time
- 1000ms
- Memory
- 128MiB
- Difficulty
- (None)
- Tags
- # Submissions
- 0
- Accepted
- 0
- Uploaded By