首页 > 代码库 > 1992 聚会
1992 聚会
1992 聚会
时间限制: 1 s
空间限制: 128000 KB
题目等级 : 黄金 Gold
题目描述 Description
小S 想要从某地出发去同学k的家中参加一个party,但要有去有回。他想让所用的
时间尽量的短。但他又想知道从不同的点出发,来回的最短时间中最长的时间是多
少,这个任务就交给了你
输入描述 Input Description
第一行三个正整数n, m, k(n是节点个数,m是有向边的条数,k是参加聚会的地点
编号)( 1 ≤ n ≤ 1000 ,1 ≤ m ≤ 100,000)
第二行..m + 1行每行3个整数x,y,w 代表从x到y需要花w的时间 0<w<=100
输出描述 Output Description
输出从不同的节点出发的最短时间中最长的时间
样例输入 Sample Input
4 8 2
1 2 4
1 3 2
1 4 7
2 1 1
2 3 5
3 1 2
3 4 4
4 2 3
样例输出 Sample Output
10
数据范围及提示 Data Size & Hint
1 #include<cstdio> 2 #include<algorithm> 3 #include<cstring> 4 #include<queue> 5 using namespace std; 6 const int MAXN = 1010; 7 8 struct Edge{ 9 int to,w,nxt;10 }e[100100];11 12 int dis[MAXN];13 int diss[MAXN];14 int head[MAXN];15 bool vis[MAXN];16 queue<int>q;17 int n,m,k,cnt,ans;18 19 void add(int u,int v,int w) //从u到v有一条长度是w的边 20 {21 ++cnt;22 e[cnt].to = v;23 e[cnt].w = w;24 e[cnt].nxt = head[u];25 head[u] = cnt;26 }27 28 void spfa(int k)29 {30 memset(dis,0x3f,sizeof(dis));31 memset(vis,0,sizeof(vis));32 while (!q.empty()) q.pop();33 dis[k] = 0;34 q.push(k);35 vis[k] = true;36 while (!q.empty())37 {38 int u = q.front();39 q.pop();40 for (int i=head[u]; i; i=e[i].nxt)41 {42 int v = e[i].to;43 int w = e[i].w;44 if (dis[v]>dis[u]+w)45 {46 dis[v] = dis[u]+w;47 if (!vis[v])48 {49 q.push(v);50 vis[v] = true;51 }52 }53 }54 vis[u] = false;55 }56 }57 58 int main()59 {60 scanf("%d%d%d",&n,&m,&k);61 for (int u,v,w,i=1; i<=m; ++i)62 {63 scanf("%d%d%d",&u,&v,&w);64 add(u,v,w);65 }66 spfa(k);67 for (int i=1; i<=n; ++i)68 diss[i] = dis[i];69 for (int i=1; i<=n; ++i)70 {71 if (i!=k) spfa(i);72 if (dis[k]<=10000000 && diss[i]<=10000000)ans = max(ans,dis[k]+diss[i]);73 }74 printf("%d",ans);75 return 0;76 }
1992 聚会
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。