比赛 不准粘代码,必须自己写(HS除外) 评测结果 AAAAAAAAAA
题目名称 电话网络 最终得分 100
用户昵称 leon 运行时间 0.212 s
代码语言 C++ 内存使用 15.66 MiB
提交时间 2019-09-23 20:35:58
显示代码纯文本
        #include <cstring>
        #include <cstdio>
        #include <cctype>
        #include <queue>
        #include <iostream> 
        #define N 100005
         
        using namespace std;
        int n,p,k,nextt[N],to[N],val[N],cnt=1,head[N],dis[N];
        bool vis[N];
        struct node
        {
        	int x,y;
        	bool operator<(node a)const
        	{
        		return y>a.y;
        	}
        };
        priority_queue<node>q;
        inline void ins(int u,int v,int w)
        {
        	nextt[++cnt]=head[u];
        	to[cnt]=v;
        	val[cnt]=w;
        	head[u]=cnt;
        }
        bool dijkstra(int x)
        {
        	memset(dis,0x3f,sizeof(dis));
        	memset(vis,0,sizeof(vis));
        	dis[1]=0;
        	q.push((node){1,dis[1]});
        	for(;!q.empty();){   
			node tmp;
        		tmp=q.top();
        		q.pop();
        		if(vis[tmp.x]) continue;
        		vis[tmp.x]=1;
        		for(int i=head[tmp.x];i;i=nextt[i])
        		{
        			int v=to[i],upd;
        			if(val[i]>x) upd=dis[tmp.x]+1;
        			else upd=dis[tmp.x];
        			if(dis[v]>upd)
        			{
        				dis[v]=upd;
        				q.push((node){v,dis[v]});
        			}
        		}
        	}
        	return dis[n]<=k;
        }
		int l,r,mid;
        int main()
        {
        	freopen("phone.in","r",stdin);
        	freopen("phone.out","w",stdout);
            cin>>n>>p>>k;
        	for(int i,x,y,z;i<=p;i++)
        	{
        		cin>>x>>y>>z;
        		ins(x,y,z);
        		ins(y,x,z);
        		r+=z;
        	}
        	r=999999999; 
        	int ans=-1;
        	for(;l<=r;)
        	{
        		mid=(l+r)/2;
        		if(dijkstra(mid)) ans=mid,r=mid-1;
        		else l=mid+1;
        	}
        	printf("%d\n",ans);
        	return 0;
        }