CCF 201712-4 90分

90分,不知道错在哪里了,dijkstra算法,用一个数组的d[i]表示以i点结尾的小路的长度,以i点为中心扩展时,若下一点为k,如果i->k是小路,则

d[j] = d[k]+M[k][j];dist[j] = min_ - pow(d[k], 2) + pow(d[j], 2);

否则直接加路径长度即可,同时把d[j]=0

#include <iostream>
#include <cstdio>
#include <climits>
#include <cmath>
#include <cstring>
#include <algorithm>
using namespace std;
const int INF = 100000000;
const int MAXN = 505;
int M[MAXN][MAXN];
int kind[MAXN][MAXN];
int dijkstra(int n)
{
    int flag[MAXN];
    long long dist[MAXN];
    int k;
    int d[MAXN];
    memset(flag, 0, sizeof(flag));
    memset(d, 0, sizeof(d));
    for (int i = 0; i < n; i++)
    {
        if (M[0][i] > 0)
        {
            if (kind[0][i] == 0)
                dist[i] = M[0][i];
            else
            {
                dist[i] = pow(M[0][i], 2);
                d[i] = M[0][i];
            }
        }
        else
            dist[i] = -1;

    }
    flag[0] = 1;
    dist[0] = 0;
    for (int i = 1; i < n; i++)
    {
        int min_ = INF;
        for (int j = 0; j < n; j++)
        {
            if (!flag[j]&&dist[j]>0&&dist[j]<min_)
            {
                min_ = dist[j];
                k = j;
            }
        }
        flag[k] = 1;
        for (int j = 0; j < n; j++)
        {
            if (!flag[j] && M[j][k]>0)
            {
                if (dist[j] < 0)
                {
                    if (kind[k][j] == 0)
                    {
                        d[j] = 0;
                        dist[j] = min_ + M[j][k];
                    }
                    else
                    {
                        d[j] = d[k]+M[j][k];
                        dist[j] = min_ - pow(d[k], 2) + pow(d[k] + M[j][k],2);
                    }
                    continue;
                }
                if (dist[j] > 0)
                {
                    if (kind[k][j] == 0)
                    {
                        if (dist[j] > min_ + M[j][k])
                        {
                            dist[j] = min_ + M[j][k];
                            d[j] = 0;
                        }
                    }
                    else
                    {
                        int temp = min_ - pow(d[k], 2) + pow(d[k] + M[k][j], 2);
                        if (dist[j] > (min_ - pow(d[k], 2) + pow(d[k]+M[k][j], 2)))
                        {
                            d[j] = d[k]+M[k][j];
                            dist[j] = min_ - pow(d[k], 2) + pow(d[j], 2);
                        }
                    }
                    continue;
                }
            }
        }

    }
    return dist[n-1];
}
int main()
{
    int n, m;
    while (~scanf("%d %d",&n,&m))
    {
        for (int i = 0; i < n; i++)
            for (int j = 0; j < n; j++)
                if (i == j)M[i][j] = 0;
                else M[i][j] = -1;
        memset(kind, 0, sizeof(kind));
        for (int i = 0; i < m; i++)
        {
            int k, a, b, c;
            scanf("%d %d %d %d", &k, &a, &b, &c);
            M[a-1][b-1] = M[b-1][a-1] = c;
            kind[a-1][b-1] = kind[b-1][a-1] = k;
        }
        cout<<dijkstra(n)<<endl;

    }
    return 0;
}

原文地址:https://www.cnblogs.com/l-h-x/p/8496821.html

时间: 2024-10-15 09:21:00

CCF 201712-4 90分的相关文章

代码实现:利用条件运算符的嵌套来完成此题:学习成绩&gt;=90分的同学用A表示,60-89分之间的用B表示,60分以下的用C表示。

package com.heima.Coding; import java.util.Scanner; /*利用条件运算符的嵌套来完成此题:学习成绩>=90分的同学用A表示,60-89分之间的用B表示,60分以下的用C表示. 程序分析:(a>b)?a:b这是条件运算符的基本例子. */ public class Test05 { public static void main(String[] args) { Scanner sc = new Scanner(System.in); Syste

读&ldquo;40 分,60 分,90 分&rdquo;

原文链接: http://mp.weixin.qq.com/s?__biz=MzA5MjYyNzY1OQ==&mid=2650901947&idx=1&sn=89af64d3b0dec01587f14aab15e62b9a#rd   40 分,60 分,90 分 原创 2016-05-27 汪海 汪海的实验室 背景 最近在微博上看到有人说,找工作太难了,面试官要求还高,才大三就问会不会这个框架那个框架的,并且表示平时项目机会少, jQuery Bootstrap 这种基础框架基本够

如何让主机合规分析报告评分达到90分?

"胖猴,某大型企业高级运维,马哥教育原创作者联盟成员,热爱分享Linux应用技术和原创知识,有30万字以上的原创内容." 说明:本次文档是根据某厂的主机合规分析报告内容进行整改的,整改后评分达到90分,本次试验环境为Centos6.7.     一.账号管理     1.1密码锁定策略 pam_tally2和pam_faillock PAM 模块都可以允许系统管理员锁定在指定次数内登录尝试失败的用户账户.并在尝试指定次数是进行锁定,防止暴力破解.检查方法:查看/etc/pam.d/sy

(要求使用指针方法)一个班有四名学生,五门课。(1)求第一门课的平均分;(2)找出有两门以上课不及格的学生,输出他们的学号、全部课程成绩和平均成绩;(3)找出平均成绩在90分以上或全部课程成绩均在85

(3)找出平均成绩在90分以上或全部课程成绩均在85分以上的学生.分别编写3个函数实现以上3个功能. #include<stdio.h> #include<stdlib.h> void aver1(float *b) { int i,j; float s=0; for(i=0;i<4;i++) {  s=s+*(b+j); j=j+5;} printf("%f\n",s/4); } void excellent(float (*b)[5]) { int n

利用条件运算符的嵌套来完成此题: 学习成绩&gt;= 90分的同学用A表示, 60-89分之间的用B表示, 60分以下的用C表示。

题目:利用条件运算符的嵌套来完成此题: 学习成绩>= 90分的同学用A表示, 60-89分之间的用B表示, 60分以下的用C表示. 程序分析:(a> b)?a:b这是条件运算符的基本例子. public class 第五题学生分数分级 { public static void main(String[] args) { System.out.print("请输入一个0-100的分数:"); Scanner in = new Scanner(System.in); int n

【程序5】 题目:利用条件运算符的嵌套来完成此题:学习成绩&gt;=90分的同学用A表示,60-89分之间的用B表示,60分以下的用C表示。 1.程序分析:(a&gt;b)?a:b这是条件运算符的基本例子。

if-else语句相对比较多,但是容易理解 1 var scroe = window.prompt("请输入1-100之间的数") 2 scroe = parseInt(scrol); 3 if (scroe>=1 && scroe<=100) { 4 if (scroe>=90) { 5 document.write("您的分数是" + scroe + "分 ,为A" ) 6 } else if(scroe&g

利用条件运算符的嵌套来完成此题:学习成绩&gt; =90分的同学用A表示,60-89分之间的用B表示,60分以下的用C表示。

package com.hanqi; import java.util.*; public class xuexichengji { public static void main(String[] args) { // TODO 自动生成的方法存根 System.out.println("输入姓名"); Scanner xingming = new Scanner(System.in); String ren = xingming.next(); System.out.println

题目:利用条件运算符的嵌套来完成此题:学习成绩&gt; =90分的同学用A表示,60-89分之间的用B表示,60分以下的用C表示。

1 package day11_3; 2 3 import java.util.*; 4 public class lianxi05 { 5 public static void main(String[] args) { 6 int x; 7 char grade; 8 Scanner s = new Scanner(System.in); 9 System.out.print( "请输入一个成绩: "); 10 x = s.nextInt(); 11 grade = x >=

对学习成绩进行评级,90分以上A;80分以上,90分以下B;以此类推

#include "pch.h"#include <iostream>using namespace std;int main(){ float score; int a; char p; while(true) { cout << "please input a score:"; cin >>score; if (score >= 90)a = 0; else if (score >= 80)a = 1; else