ZJNU 1367 - Party--中高级

寻找从i到X,再从X到i的最短路

可以在正向图中从X开始跑一遍最短路,每个点的距离dis1[i]当作从X回到点i的距离

再将图反向从X再跑一遍,每个点的距离dis2[i]当作从i到点X的距离

最后搜索dis1[i]+dis2[i]值最大的输出

 1 /*
 2 Written By StelaYuri
 3 */
 4 #include<bits/stdc++.h>
 5 #define INF 0x3f3f3f3f
 6 using namespace std;
 7 typedef pair<short,int> P;
 8 vector<P> graph1[1005],graph2[1005];
 9 int N,M,X,dis1[1005],dis2[1005];
10 bool vis1[1005],vis2[1005];
11 queue<short> q;
12 int main()
13 {
14     ios::sync_with_stdio(0);cin.tie(0);
15     int i,j,d,cnt,len,ans=0;
16     short a,b,id;
17     cin>>N>>M>>X;
18     for(i=0;i<M;i++)
19     {
20         cin>>a>>b>>d;
21         graph1[a].push_back(P(b,d));
22         graph2[b].push_back(P(a,d));
23     }
24     memset(dis1,INF,sizeof dis1);
25     memset(dis2,INF,sizeof dis2);
26     memset(vis1,false,sizeof vis1);
27     memset(vis2,false,sizeof vis2);
28     dis1[X]=dis2[X]=0;
29     vis1[X]=vis2[X]=true;
30     q.push(X);
31     while(!q.empty())
32     {
33         id=q.front();
34         q.pop();
35         cnt=graph1[id].size();
36         for(i=0;i<cnt;i++)
37         {
38             len=dis1[id]+graph1[id][i].second;
39             if(!vis1[graph1[id][i].first]||len<dis1[graph1[id][i].first])
40             {
41                 dis1[graph1[id][i].first]=len;
42                 vis1[graph1[id][i].first]=true;
43                 q.push(graph1[id][i].first);
44             }
45         }
46     }
47     q.push(X);
48     while(!q.empty())
49     {
50         id=q.front();
51         q.pop();
52         cnt=graph2[id].size();
53         for(i=0;i<cnt;i++)
54         {
55             len=dis2[id]+graph2[id][i].second;
56             if(!vis2[graph2[id][i].first]||len<dis2[graph2[id][i].first])
57             {
58                 dis2[graph2[id][i].first]=len;
59                 vis2[graph2[id][i].first]=true;
60                 q.push(graph2[id][i].first);
61             }
62         }
63     }
64     for(i=1;i<=N;i++)
65     {
66         if(i==X)
67             continue;
68         ans=max(ans,dis1[i]+dis2[i]);
69     }
70     cout<<ans;
71
72     return 0;
73 }

原文地址:https://www.cnblogs.com/stelayuri/p/12235257.html

时间: 2024-10-11 18:42:41

ZJNU 1367 - Party--中高级的相关文章

ZJNU 1262 - 电灯泡——中高级

在影子没有到达墙角前,人越远离电灯,影子越长,所以这一部分无需考虑 所以只需要考虑墙上影子和地上影子同时存在的情况 因为在某一状态存在着最值 所以如果以影子总长与人的位置绘制y-x图像 会呈一个类似y=-x^2函数的图像 所以就可以根据三分法找出最值点 1 /* 2 Written By StelaYuri 3 */ 4 #include<stdio.h> 5 double H,h,D; 6 double len(double lh){ 7 return lh+D*(h-lh)/(H-lh);

ZJNU 1310 - 排队——中高级

蒟蒻做法:追踪1号队员,取他回到原来位置需要的次数 1 /* 2 Written By StelaYuri 3 */ 4 #include<stdio.h> 5 int main(){ 6 int T,t,n,ans,x; 7 scanf("%d",&T); 8 for(t=1;t<=T;t++){ 9 scanf("%d",&n); 10 ans=x=1; 11 while(x!=n+1){ 12 if(x>n) 13 x=

ZJNU 1535 - 新建的大楼--中高级

因为从俯视图看,输入输出的视角是从右下方看向左上方的 所以左上角的正方体最有可能被其他正方体挡住 立体上,底部的正方体最有可能被顶部的正方体挡住 所以绘图应该从后往前,从下往上绘制 剩下的就是一大堆计算和判断了 采用的是先绘制出规范的图再与输入的图做对比的方式 1 /* 2 Written By StelaYuri 3 */ 4 #include<stdio.h> 5 #include<string.h> 6 int n,m,ar[21][21]; 7 char ori[200][

ZJNU 1542 - 三角形(续)--中高级

从小到大排序后 先固定一遍,另外两边递增查找 即固定 i,j=i+1,k=j+1 然后让k递增到 a[i]+a[j]<=a[k] 时 此时不能凑成一个三角形 答案增加 k-1-j 组 此时不需要重置 k=j+1 因为 j++ 后 a[j] 会变大 那么在 j~k 之间的所有木棍长度均能再次满足这种 ij 组合 此时只需要把前一个状态的 k 继续往后查找即可 如果 k 查找到了最后,因为i固定,可得 j 不断向后移动,最后能增加的组合有 (n-j)*(n-j-1)/2 组,结束 j 循环,i++

hdu 3047 Zjnu Stadium

Zjnu Stadium Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Total Submission(s): 2109    Accepted Submission(s): 808 Problem Description In 12th Zhejiang College Students Games 2007, there was a new stadium built

HDU 3407.Zjnu Stadium 加权并查集

Zjnu Stadium Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total Submission(s): 3726    Accepted Submission(s): 1415 Problem Description In 12th Zhejiang College Students Games 2007, there was a new stadium built

Zjnu Stadium(加权并查集)

Zjnu Stadium Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total Submission(s): 3186    Accepted Submission(s): 1226 Problem Description In 12th Zhejiang College Students Games 2007, there was a new stadium built

中高级PHP开发者应该掌握哪些技术?

中级PHP程序员 1.Linux 能够流畅的使用Shell脚本来完成很多自动化的工作:awk/sed/perl 也操作的不错,能够完成很多文本处理和数据统计等工作:基本能够安装大 部分非特殊的Linux程序(包括各种库.包.第三方依赖等等,比如MongoDB/Redis/Sphinx/Luncene/SVN之类的):了解基 本的Linux服务,知道如何查看Linux的性能指标数据,知道基本的Linux下面的问题跟踪等 2. Nginx:  在第一阶段的基础上面,了解复杂一些的Nginx配置:包括

HDU 3047 Zjnu Stadium 带权并查集

题目来源:HDU 3047 Zjnu Stadium 题意:给你一些人 然后每次输入a b c 表示b在距离a的右边c处 求有多少个矛盾的情况 思路:用sum[a] 代表a点距离根的距离 每次合并时如果根一样 判断sum数组是否符合情况 根不一样 合并两棵树 这里就是带权并查集的精髓 sum[y] = sum[a]-sum[b]+x 这里y的没有合并前b的根 #include <cstdio> #include <cstring> using namespace std; cons