首页 > 其他分享 >TZOJ 1693:银牛派对(最短路/dijstra)

TZOJ 1693:银牛派对(最短路/dijstra)

时间:2022-10-14 14:47:13浏览次数:73  
标签:ma int pos dijstra 1693 TZOJ 1005 奶牛 dis

描述

 

N个农场(1 ≤ N ≤ 1000)中的每一个都有一头奶牛,编号为 1.. N将参加在农场 # X(1 ≤ X ≤ N)举行的大型奶牛聚会。总共有M (1 ≤ M ≤ 100,000) 条单向(单向道路连接成对的农场;道路i需要i (1 ≤ i ≤ 100) 单位时间才能穿过。

每头奶牛必须步行去参加聚会,聚会结束后,回到她的农场。每头奶牛都很懒惰,因此会选择最短时间的最佳路线。由于道路是单向的,母牛的返回路线可能与她前往派对的原始路线不同。

在所有奶牛中,一头奶牛必须花多长时间去参加聚会和回来?

 

输入

第 1 行:三个空格分隔的整数,分别为:NMX
第 2 行.. M +1:第i +1 行用三个空格分隔的整数描述道路i : iii。所描述的道路从农场i延伸到农场i,需要i个时间单位来穿越。

输出

第 1 行:一个整数:任何一头牛必须行走的最长时间。

样例输入

 

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

样例输出

 10

提示

奶牛 4 直接前往派对(3 个单位)并通过农场 1 和 3(7 个单位)返回,总共 10 个时间单位。 一开始想着是从起点到x算一遍再加上x到起点算一遍加起来,然后果不其然,TLE了。。去洛谷对了一下是有两个样例TLE了,还不错哈哈,然后看了看网上的解决方案是先计算起点到x得到一个dis最短路数组,然后将dis存储到另一个数组way上,再将原地图转置,继续算一遍dijstra就好了,结尾把dis和way的数值加起来比较每个点的最大值即可
#include<bits/stdc++.h>
using namespace std;
const int inf = 1e8+10;
int ma[1005][1005];
int vis[1005];
int dis[1005],way[1005];
int n,m,x;
void dijstra(int sx)
{
    int pos=1,minn,sum=0;
    memset(vis,0,sizeof(vis));
    for(int i=1;i<=n;i++)dis[i] = ma[sx][i];
    vis[sx] = 1;
    dis[sx] = 0;
    for(int i=1;i<=n;i++)
    {
        minn = inf;
        for(int j=1;j<=n;j++)
        {
            if(vis[j]==0&&minn>dis[j])
            {
                minn = dis[j];
                pos = j;
            }
        }
        if(minn==inf)break;
        vis[pos] = 1;
        for(int j=1;j<=n;j++)
        {
            if(vis[j]==0&&dis[j]>minn+ma[pos][j])
            {
                dis[j] = minn+ma[pos][j];
            }
        }
    }
}
int main()
{
    cin>>n>>m>>x;
    for(int i=1;i<=n;i++)
        for(int j=1;j<=n;j++)
        {
            if(i==j)ma[i][j] = 0;
            else ma[i][j] = inf;
        }
    for(int i=1;i<=m;i++)
    {
        int a,b,c;
        cin>>a>>b>>c;
        if(ma[a][b]>c) ma[a][b] = c;
    }
    dijstra(x); //先计算每个点到x的最短路 
    for(int i=1;i<=n;i++)way[i] = dis[i]; //把到x的最短路记录到way中 
    for(int i=1;i<=n;i++)
        for(int j=i+1;j<=n;j++)
        {
            swap(ma[i][j],ma[j][i]);//逆置矩阵,就可以将单向图逆转 
        }
    dijstra(x);//这里就相当于是计算x到各个点的最短路 
    int ans = -1;
    for(int i=1;i<=n;i++)
    {
        ans = max(way[i]+dis[i],ans);
    }
    cout<<ans;
     return 0;
}

 

标签:ma,int,pos,dijstra,1693,TZOJ,1005,奶牛,dis
From: https://www.cnblogs.com/jyssh/p/16791536.html

相关文章

  • CF1693F I Might Be Wrong 题解
    感觉是一个比较套路的题目。思路很容易就可以胡出一个贪心策略。每一次操作都选一个从前面开始最长的\(0,1\)数量相同的序列进行操作。看一眼好像样例都能过。可以......
  • TZOJ 7871:维护序列 单链表应用(创建/查询/插入/删除)
    描述 给定一个长度为n的整数序列。现在有m个操作,操作分为三类,格式如下:(1)1i:询问序列中第i个元素的值,保证i小于等于当前序列长度。(2)2iv:在序列中第i个元素前加......
  • TZOJ 7886: 连通块 深搜广搜模板题
    描述一个n*m的方格图,一些格子被涂成了黑色,在方格图中被标为1,白色格子标为0。问有多少个四连通的黑色格子连通块。四连通的黑色格子连通块指的是一片由黑色格子组成的区......
  • TZOJ 7685: 最短路径 (dijstra/输出路径pre)
    描述  给定n个顶点的带权有向图,若从顶点x到顶点y之间存在一条路径,那么这条路径的长度定义为路径上各条边的权值之和。现在请你找出从顶点1到顶点n的一条最短路径。......
  • TZOJ 2777: Hero in Maze 简单版/深搜DFS
    描述 500年前,Jesse是我国最卓越的剑客。他英俊潇洒,而且机智过人^_^。突然有一天,Jesse心爱的公主被魔王困在了一个巨大的迷宫中。Jesse听说这个消息已经是两天以后了,他......
  • TZOJ 6948: 走迷宫/深搜模板
    描述 有一个迷宫,图案如图5.2.6所示,红色区域表示不能通行,蓝色区域表示能通行,在迷宫中通行的方向是上下左右四个方向。从入口(1,1)位置进入迷宫,编程判断能否从出口位置......
  • TZOJ 2674: 一个人的旅行 最短路/Floyd
    描述虽然草儿是个路痴(就是在tzc待了一年多,居然还会在校园里迷路的人,汗~),但是草儿仍然很喜欢旅行,因为在旅途中会遇见很多人(白马王子,^0^),很多事,还能丰富自己的阅历,还可以看......
  • CF1144G & CF1693D & CF1647F
    CF1144G:给定一个长度为\(n\)的序列\(A\)。问能否把它拆成一个严格递增序列和一个严格递减序列(可以为空),如果有解则输出方案。\(n\le2\times10^5\)。设\(f_{i,0}......
  • CF1693E
    考虑到一个结论就是\(a_i\)会变成两种操作变成的数的最小值。看着就很对啊,感性理解就好了。我们从大到小考虑每一个值。当访问一个值时,我们将其所有位置都标记成“未......
  • CF1693F
    首先可以假定整个序列\(c_0\gec_1\),否则我们把\(0\)变成\(1\),\(1\)变成\(0\),并翻转序列。新序列答案与原序列相同。结论:仅操作\(c_0=c_1\)的区间的最小答案和原......