• HDU(4522) 湫湫系列故事——过年回家


    题目:http://acm.hdu.edu.cn/showproblem.php?pid=4522

    建两个图,分别用dijstra。

    #include<stdio.h>
    #include<iostream>
    #include<string.h>
    #include<math.h>
    #include<string>
    #include<algorithm>
    #pragma comment(linker, "/STACK:1024000000,1024000000")
    using namespace std;
    const int maxn = 205;
    const int inf = 0x3fffffff;
    int map[2][maxn][maxn];
    int dist[2][maxn];
    int vis[maxn];
    int n,t,a,b;
    void dijstra(int flag){
        memset(vis, 0, sizeof(vis));
        int i, j, k;
        
        for (i=1; i<=n; ++i)
            dist[flag][i] = inf;
        
        for (dist[flag][a]=0, i=1; i<=n; ++i){
            for(k=-1, j=1; j<=n; ++j){
                if (!vis[j] && (k == -1 || dist[flag][j] < dist[flag][k]))
                    k = j;
            }
            for(vis[k]=1, j=1; j<=n; ++j)
            {
                if (!vis[j] && dist[flag][k] + map[flag][k][j] < dist[flag][j])
                    dist[flag][j] = dist[flag][k] + map[flag][k][j];
            }
        }
    }
    
    int main(){
        int q;
        scanf("%d",&q);
        while(q--){
            scanf("%d%d",&n,&t);
            for(int i = 1;i <= n;i++)
                for(int j = 1;j <= n;j++){
                    map[0][i][j] = inf;
                    map[1][i][j] = inf;
                }
            for(int i = 0;i < t;i++){
                int tmp[25*maxn];
                char c = '+';
                int j = 0;
                while (c == '+'){
                    scanf("%d", &tmp[j++]);
                    c = getchar();
                }
                //for(int i = 0;i < j;i++)
                  //  printf("%d ",tmp[i]);
                int flag;
                scanf("%d",&flag);
                if(flag){
                    for(int k = 1;k < j;k++){
                        map[0][tmp[k-1]][tmp[k]] = 1;
                        map[1][tmp[k-1]][tmp[k]] = 1;
                    }
                }
                else
                    for(int k = 1;k < j;k++)
                        map[1][tmp[k-1]][tmp[k]] = 1;
            }
            for (int i=0; i<=n; i++) map[0][i][i] = map[1][i][i] = 0;
            int d1,d2;
            scanf("%d%d",&d1,&d2);
            scanf("%d%d",&a,&b);
            dijstra(0);
            dijstra(1);
            if (dist[0][b] >= inf && dist[1][b] >= inf)
                puts("-1");
            else if (dist[0][b] >= inf)
                printf("%d\n",dist[1][b]*d1);
            else if (dist[1][b] >= inf)
                printf("%d\n", dist[0][b]*d2);
            else
                printf("%d\n", min(dist[0][b]*d2, dist[1][b]*d1));
        }
        return 0;
    }
  • 相关阅读:
    WPF 文本滚动效果 渐变效果
    Unity3D 学习——入门资料整理
    命名管道 问题:信号灯超时问题
    Nginx 遇到的问题
    Nginx的安装配置 例子
    03 Spring的父子容器
    02 浅析Spring的AOP(面向切面编程)
    03 JVM的垃圾回收机制
    02 Java类的加载机制
    01 深入理解JVM的内存区域
  • 原文地址:https://www.cnblogs.com/Roly/p/3103795.html
Copyright © 2020-2023  润新知