POJ1135 Domino Effect(SPFA)

题目大概是,普通骨牌连接两张关键骨牌,一旦一张关键骨牌倒下与其相邻的普通骨牌也倒下,普通骨牌倒下与其相邻的骨牌也倒下。给出所有有普通骨牌相连的两个关键骨牌之间普通骨牌倒下所需时间,问1号关键骨牌开始倒下后最后一张骨牌倒下的时间和位置。

居然是最短路。。记dist[u]为起点骨牌1到关键骨牌u的最短时间,跑个单源最短路可得出。最后倒下的骨牌,有两种情况:

  1. 倒下的是关键骨牌u,那么倒下的时间就是dist[u]
  2. 倒下的是关键骨牌u和v之间某张普通骨牌,那么倒下的时间就是 (dist[u]+dist[v]+time(u,v))/2,因为:
    • dist[u]=dist[v]显然成立,不等于的情况不妨设dist[u]<dist[v];
    • 那么过了dist[u]的时间后,通往u点的骨牌到正好达u点,而通往v点的还需dist[v]-dist[u]的时间到达v;
    • 因而两边这时还有dist[v]-dist[u]+time(u,v)的时间长度,两边同时倒就还需要(dist[v]-dist[u]+time(u,v))/2的时间;
    • 所以总共需要(dist[v]-dist[u]+time(u,v))/2+dist[u],即(dist[v]+dist[u]+time(u,v))/2的时间。

这样分别搞搞这两种情况,就能找到答案。

 1 #include<cstdio>
 2 #include<cstring>
 3 #include<queue>
 4 #include<algorithm>
 5 using namespace std;
 6 #define MAXN 555
 7 #define MAXM 555*555*2
 8 
 9 struct Edge{
10     int u,v,cost,next;
11 }edge[MAXM];
12 int head[MAXN],NE,n;
13 void addEdge(int a,int b,int c){
14     edge[NE].u=a; edge[NE].v=b; edge[NE].cost=c; edge[NE].next=head[a];
15     head[a]=NE++;
16 }
17 
18 int d[MAXN];
19 void SPFA(int vs){
20     memset(d,127,sizeof(d));
21     d[vs]=0;
22     bool vis[MAXN]={0};
23     vis[vs]=1;
24     queue<int> que;
25     que.push(vs);
26     while(!que.empty()){
27         int u=que.front(); que.pop();
28         for(int i=head[u]; i!=-1; i=edge[i].next){
29             int v=edge[i].v;
30             if(d[v]>d[u]+edge[i].cost){
31                 d[v]=d[u]+edge[i].cost;
32                 if(!vis[v]){
33                     vis[v]=1;
34                     que.push(v);
35                 }
36             }
37         }
38         vis[u]=0;
39     }
40 }
41 int main(){
42     int m,a,b,c,cse=0;
43     while(~scanf("%d%d",&n,&m) && (n||m)){
44         NE=0;
45         memset(head,-1,sizeof(head));
46         while(m--){
47             scanf("%d%d%d",&a,&b,&c);
48             addEdge(a,b,c);
49             addEdge(b,a,c);
50         }
51         SPFA(1);
52         double res=-1;
53         bool flag=0;
54         for(int i=1; i<=n; ++i){
55             if(d[i]>res){
56                 res=d[i];
57                 a=i;
58             }
59         }
60         for(int i=0; i<NE; i+=2){
61             double tmp=(d[edge[i].u]+d[edge[i].v]+edge[i].cost)/2.0;
62             if(tmp>res){
63                 res=tmp;
64                 flag=1;
65                 a=edge[i].u; b=edge[i].v;
66                 if(a>b) swap(a,b);
67             }
68         }
69         printf("System #%d\n",++cse);
70         if(flag) printf("The last domino falls after %.1f seconds, between key dominoes %d and %d.\n\n",res,a,b);
71         else printf("The last domino falls after %.1f seconds, at key domino %d.\n\n",res,a);
72     }
73     return 0;
74 }

 

转载于:https://www.cnblogs.com/WABoss/p/5271469.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
智慧校园建设方案旨在通过先进的信息技术,为师生提供一个全面智能的感知环境和综合信息服务平台。该方案正处在从信息化第二阶段向第三阶段过渡的关键时期,致力于实现校园服务和管理的全面智能化。 方案的核心目标是构建一个集成的校园地理信息服务平台,通过该平台实现资产管理、房产信息管理、基础设施管理、绿化管理和能源监测管理等功能。同时,该平台将提供校园漫游、信息服务、指引服务、活动通知、用房服务和客流统计等多样化服务,以促进校园的和谐、绿色、平安和便捷。 在技术层面,智慧校园建设方案强调系统集成能力、数据统一分析能力、系统资源共享能力以及大数据集成处理能力。通过这些能力,可以构建统一的校园地理信息平台,提供综合的应用支撑和管理能力,实现系统平滑演进。 应用方向上,智慧校园建设方案围绕和谐校园、绿色校园、平安校园和掌上校园四个维度展开。和谐校园侧重于提供校园漫游、信息服务、指引服务等,增强师生的校园体验。绿色校园则关注资产管理和能源监测,推动校园的可持续发展。平安校园通过视频监控、数字巡更等手段,确保校园安全。掌上校园则利用移动设备,实现校园服务的随时随地访问。 最终,智慧校园建设方案将通过三维虚拟校史馆、720度成像技术等创新应用,提供身临其境的校园漫游体验,同时通过可视化管理和数据分析,优化校园资源配置和运营效率,实现校园管理的智能化和现代化。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值