比赛 |
练习12 |
评测结果 |
WWWWWAAAAWWWW |
题目名称 |
架设电话线 |
最终得分 |
30 |
用户昵称 |
liuyu |
运行时间 |
0.024 s |
代码语言 |
C++ |
内存使用 |
4.19 MiB |
提交时间 |
2017-06-30 11:05:52 |
显示代码纯文本
- #include<bits/stdc++.h>
- using namespace std;
-
- int n,p,k,s[1004][1004],vis[1003];
- vector<int>vec[1004];
- int dist[1004],inque[1003],last[1003];
- queue<int>que;
- int t=1,ans[1004];
-
- bool cmp(int a,int b)
- {
- return a>=b;
- }
- void init()
- {
- scanf("%d%d%d",&n,&p,&k);
- for(int i=1;i<=p;i++)
- {
- int a,b,c;
- scanf("%d%d%d",&a,&b,&c);
- vec[a].push_back(b);
- vec[b].push_back(a);
- s[a][b]=s[b][a]=c;
- }
- }
- void spfa()
- {
- memset(dist,0x3f,sizeof(dist));
- dist[1]=0;
- que.push(1);
- inque[1]=1;
- while(!que.empty())
- {
- int now=que.front();
- que.pop();
- inque[now]=0;
- for(int i=0;i<vec[now].size();i++)
- {
- if(dist[now]+s[now][vec[now][i]]<dist[vec[now][i]])
- {
- dist[vec[now][i]]=dist[now]+s[now][vec[now][i]];
- last[vec[now][i]]=now;
- if(!inque[vec[now][i]])
- {
- inque[vec[now][i]]=1;
- que.push(vec[now][i]);
- }
- }
- }
- }
- for(int i=n;i!=1;i=last[i])
- {
- ans[t]=s[i][last[i]];t++;
- }
- }
- void work()
- {
- sort(ans+1,ans+t,cmp);
- printf("%d\n",ans[k+1]);
- }
- void dfs(int now)
- {
- vis[now]=1;
- for(int i=0;i<vec[now].size();i++)
- {
- if(!vis[vec[now][i]]){
- dfs(vec[now][i]);
- }
- }
- }
- int main()
- {
- freopen("phoneline.in","r",stdin);
- freopen("phoneline.out","w",stdout);
- init();
- //判断;
- dfs(1);
- if(!vis[n]){
- printf("-1\n");
- return 0;
- }
- memset(vis,0,sizeof(vis));
- spfa();
- work();
- return 0;
- }