TZOJ 3692: 紧急援救 最短路/dijstra

描述

 

人质被恐怖分子扣押,幸好警察已经在一些路口准备好警车随时出动,救援马上开始...
zzzz,稍安勿躁,警察需要以最少的时间到达案发现场,那应该出动哪辆警车呢?这辆警车最快需要多少时间能够到达现场呢?又幸好警方最近聘请了一位编程高手,那就是你,现在请你马上编写程序来实现。

 

输入

 

输入数据的第一行为3个整数n(n<=1000)、m(m<=10000)和s,其中n表示路口的数目,分别从1到n进行编号,m表示马路的条数,s表示案发次数。
接下来有m行,每行表示一条马路信息,每条马路信息包含起点s(路口编号)、终点e(路口编号)以及从s到e所需要的时间t,其中1<=s,e<=n,t为一个非负实数。
接下来包含s个案件,每个案件有两行,第一行为两个正整数c和k,c表示案发现场(路口编号),k表示警车的数目,第二行有k个正整数,每个正整数对应一个警车所在的路口编号。

 

输出

 

对每个案件,第一行输出:
Scenario x:
其中x表示案件的编号,从1开始。
第二行输出最快到达的时间,保留2位小数,如果无法到达则输出:
Impossible.
每个案件之后再输一个空行。

 

样例输入

 

6 9 2
1 2 3.5
1 3 1.2
3 4 4.9
2 4 0.221
5 4 0.1
5 6 1.3
4 6 1
2 3 0
3 2 5
4 2
1 3
5 1
6

样例输出

 

Scenario 1:
3.72

Scenario 2:
Impossible.

 题目的意思就是先给定n个点及m条路的路径长度,然后有s个案件,对于每个案件的现场c都有k辆警车在附近候着,问你这k辆警车谁能最快到达现场c,算是多源最短路?;然后一开始写了个返回值的dijstra,但是太混乱了,最后参考了一下别人的代码写了个无返回值的,更接近bfs,也算是更熟悉,多一种参考

复制代码
#include<bits/stdc++.h>
using namespace std;
int n,m,s,c,k;
int vis[1001];
double dis[1001],ma[1001][1001];
const int inf = 1e9+10; 
void dijstra(int st)
{
    int pos=1,mi,sum=0;
    memset(vis,0,sizeof(vis));
    //memset(dis,inf,sizeof(dis));
    for(int i=1;i<=n;i++)dis[i] = ma[st][i];
    vis[st] = 1;
    dis[st] = 0;
    //int T = n;
    for(int i=1;i<=n;i++)
    {
        mi = inf;
        for(int j=1;j<=n;j++)
        {
            if(vis[j]==0&&mi>dis[j])
            {
                mi = dis[j];
                pos = j;
            }
        }
        if(mi==inf)break;
        vis[pos] = 1;
        for(int j=1;j<=n;j++)
        {
            if(vis[j]==0&&dis[j]>dis[pos]+ma[pos][j])
                dis[j] = dis[pos]+ma[pos][j];
        }
    }
}
int main()
{
    cin>>n>>m>>s;
    for(int i=1;i<=n;i++)
        for(int j=1;j<=n;j++)
            ma[i][j] = inf;
    for(int i=1;i<=m;i++)
    {
        int a,b;
        double t;
        cin>>a>>b>>t;
        if(ma[a][b]>t) ma[a][b] = t;
    }
    for(int i=1;i<=s;i++)
    {
        cin>>c>>k;
        double minn = inf;
        for(int j=1;j<=k;j++)
        {
            int star;
            cin>>star;
            dijstra(star);
            if(dis[c]<minn) minn = dis[c];
        }
        if(minn!=inf)printf("Scenario %d:\n%.2f\n\n",i,minn);
        else printf("Scenario %d:\nImpossible.\n\n",i);
    }
     return 0;
}
复制代码

 

posted @   CRt0729  阅读(15)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· 单线程的Redis速度为什么快?
· SQL Server 2025 AI相关能力初探
· AI编程工具终极对决:字节Trae VS Cursor,谁才是开发者新宠?
· 展开说说关于C#中ORM框架的用法!
点击右上角即可分享
微信分享提示