zoukankan      html  css  js  c++  java
  • POJ1125

    题意

    给出多组数据,
    每组数据给出一个 (n) ,表示接下来有 (n) 行,
    每行给出一个 (x) ,表示后面跟着x对数据 ((y、z))
    代表第 (i) 行到 (y)的时间为 (z)
    问从第几号开始传所需的时间最少,
    输出编号和最短时间。

    思路

    可以用Floyd写,我用的是dijkstra写。
    for循环遍历每个dijkstra即可。

    注意

    1. C++会过,G++会WA,不知道为啥子

    2. 必须给全(n*n)全部信息(全部边),才可以直接写dijkstra,否则必须要对边进行初始化(两层for循环)!!!

    AC代码

    #include<iostream>
    #include<string.h>
    #include<algorithm>
    #include<stdio.h>
    #include<cmath>
    #include<list>
    #include<stdlib.h>
    #include<stack>
    #include<stdio.h>
    #include<queue>
    using namespace std;
    typedef long long ll;
    #define sc(T) scanf("%d",&T)
    #define scc(x,y) scanf("%d %d",&x,&y)
    #define pr(T) printf("%d
    ",T)
    #define f(a,b,c) for (int a=b;a<=c;a++)
    #define ff(a,b,c) for (int a=b;a>=c;a--)
    #define inf 0x3f3f3f3f
    #define mem(a,b) memset(a,b,sizeof(a))
    #define eps 1e-9
    #define PI acos(-1)
    
    int n,a[110][110],dis[110],ans[110];
    bool book[110];
    
    void dijkstra(int x)
    {
        mem(book,0);
        for(int i=1; i<=n; i++)
            dis[i]=a[x][i];
        book[x]=1; // dis[x]=0;可写可不写
        int k;
        for(int i=; i<=n; i++)
        {
            int mi=inf;
            for(int j=1; j<=n; j++)
            {
                if(!book[j]&&dis[j]<mi) 
                    mi=dis[j],k=j;
            }
            //  if(k==0) //可写可不写
            //   return; //没有可直接到达的点
            book[k]=1;
            for(int j=1; j<=n; j++)
            {
                //       !=
                if(a[k][j]<inf&&dis[j]>dis[k]+a[k][j])
                    dis[j]=dis[k]+a[k][j];
            }
        }
    //    int p=0;
    //    for(int i=1; i<=n; i++)
    //        p+=dis[i];
    //    ans[x]=p;
    }
    
    int main()
    {
        while(~scanf("%d",&n)&&n) //n个人
        {
            for(int i=1; i<=n; i++) //一定要写!
            {
                for(int j=1; j<=n; j++)
                {
                    if(i==j)
                        a[i][j]=0;
                    else
                        a[i][j]=inf;
                }
            }
    //        mem(a,0);
            for(int i=1; i<=n; i++)
            {
                int x;
                sc(x);
                for(int j=1; j<=x; j++)
                {
                    int xx,yy;
                    scc(xx,yy);
                    a[i][xx]=min(a[i][xx],yy); // 傻不拉几的我,这里竟然错了!!!
                }
            }
    // 求从第几号开始传 所需的时间最少 求出这个最短时间
    //        for(int i=1; i<=n; i++)
    //            dijkstra(i);
    //        int k,kk,c=inf,flag=0;
    //        for(int i=1; i<=n; i++)
    //        {
    //            if(ans[i]>=inf)
    //            {
    //                flag=1;
    //                break;
    //            }
    //            if(ans[i]<c)
    //                c=ans[i],k=i;
    //        }
            int ma=-inf,mi=inf,k=1;
            for(int i=1; i<=n; i++)
            {
                ma=-inf;
                dijkstra(i);
                for(int j=1; j<=n; j++)
                    ma=max(ma,dis[j]);
                if(ma<mi)
                    k=i,mi=ma;
            }
            if(mi==inf)
                printf("disjoint
    ");
            else
                cout<<k<<" "<<mi<<endl;
        }
        return 0;
    }
    
  • 相关阅读:
    iOS iOS与html进行交互
    2. SwiftUI学习之_padding1()
    基础知识 1. 设计模式是什么?你知道哪些设计模式,请简要叙述?
    swift 5.0富文本
    ios 本地化
    ios报错:nw_protocol_get_quic_image_block_invoke dlopen libquic failed
    IOS开发没有开发者账号也可以进行测试
    swift项目中新的字体如何加入
    TestFlight用法 包教包会(iOS APP官方测试工具)
    IOS FMDB的使用
  • 原文地址:https://www.cnblogs.com/OFSHK/p/13685468.html
Copyright © 2011-2022 走看看