• P2009 跑步


    认真读题。

    弗洛伊德,

    初始化为极大值,如果是自己到自己则赋值为0;

    然后注意输入时那个环上权值的赋值操作,比较好理解;

    把字符转化为数字做下标,

    如果不为极大值的话,说明已经被赋值了,已经有直接连接这两个点的路了,

    根据题目要求,这种情况下我们要取较大的那个;

    如果为极大值,说明还没有被赋值,此时直接赋值为输入的权值;

    然后就是弗洛伊德求最短路的操作了。 

    #include<iostream>
    #include<cstdio>
    #include<cmath>
    #include<algorithm>
    #include<cstring>
    using namespace std;
    const int mod=1e9+7;
    
    int n,m,x,a,b;
    int f[22][22];
    char c;
    
    int main()
    {
    	scanf("%d%d",&n,&m);
    	for(int i=1;i<=n;++i)
    		for(int j=1;j<=n;++j)
    			f[i][j]=(i!=j)?mod:0;
    	for(int i=1;i<=n;++i)
    	{
    		scanf("%d",&x);
    		if(i!=n) 
    		{
    			f[i][i+1]=x;
    			f[i+1][i]=x;
    		}
    		else
    		{
    			f[1][n]=x;
    			f[n][1]=x;
    		}
    	}
    	for(int i=1;i<=m;++i)
    	{
    		cin>>c;a=c-'A'+1;
    		cin>>c;b=c-'A'+1;
    		cin>>x;
    		if(f[a][b]!=mod) 
    			f[a][b]=f[b][a]=max(x,f[a][b]);
    		else f[a][b]=f[b][a]=x;
    	}
    	for(int k=1;k<=n;++k)
    		for(int i=1;i<=n;++i)
    			for(int j=1;j<=n;++j)
    				f[i][j]=min(f[i][j],f[i][k]+f[k][j]);
    	cin>>c;a=c-'A'+1;
    	cin>>c;b=c-'A'+1;
    	printf("%d",f[a][b]);
    	return 0;
    } 

    如果你不开心,那我就把右边这个帅傻子分享给你吧,   

    你看,他这么好看,那么深情的望着你,你还伤心吗?   

    真的!这照片盯上他五秒钟就想笑了。   

    一切都会过去的。 

  • 相关阅读:
    理解缓慢变化维(Slowly Changing Dimension)
    分析Reporting Service的报表执行记录
    XCOPY
    Esxi主机从VC断开的怪事
    奇怪的SQLserver执行
    明细表达到15亿了
    现在才知道“quota”
    oledb读取Excel数据丢失原因
    配置subversion
    sql服务器的操作系统升级,数据库如何来迁移呢?
  • 原文地址:https://www.cnblogs.com/Mary-Sue/p/9832281.html
Copyright © 2020-2023  润新知