POJ 3169 Layout

思路:

这题完全按照挑战上面的方法来做,开始我不是很能理解这种方法的含义。请自行阅读挑战。

一开始我超时了,不知道是什么原因,我写了一个队列优化的bellman ford ,还用了vector的邻接表,不知道为什么会超时。。。其实回头看一下,bellman ford根本就不需要邻接表。。。。

回头再看一下那个队列优化吧,感觉是自己写崩了。

后来直接重写,最普通的那种bellamn ford 结果过了。。。。

随便说一下,感觉挑战上面的写法有问题,奶牛的编号是从一开始的,可是挑战上面奶牛的编号貌似是从0开始的

#include<iostream>
#include<cstdio>
using namespace std;
const int inf=2100000000;
int u[30000],v[30000],w[30000];
int dis[10086];
int main()
{
    int n,ml,md;
    scanf("%d%d%d",&n,&ml,&md);
    int t=0;
    for(int i=2;i<=n;i++){
        u[t]=i;v[t++]=i-1;
    }
    int x,y,wa;
    for(int i=1;i<=ml;i++){
        scanf("%d%d%d",&u[t],&v[t],&w[t]);
        t++;
    }
    for(int i=1;i<=md;i++){
        scanf("%d%d%d",&v[t],&u[t],&w[t]);
        w[t]*=-1;t++;
    }
    fill(dis,dis+n+5,inf);
    int flag=0;
    dis[1]=0;
    for(int k=0;k<n;k++){
        flag=0;
        for(int i=0;i<t;i++){
            if(dis[v[i]]>dis[u[i]]+w[i]){
                dis[v[i]]=dis[u[i]]+w[i];
                flag=1;
            }
        }
        if(!flag){break;}
    }
    if(dis[1]<0){printf("-1\n");}
    else if(dis[n]==inf){printf("-2\n");}
    else printf("%d\n",dis[n]);
}

猜你喜欢

转载自www.cnblogs.com/ZGQblogs/p/9093095.html