LightOJ

来源:互联网 发布:网络实名制 郭德纲 编辑:程序博客网 时间:2024/04/20 07:13
/*题意:有n个城市,每一个城市有一个拥挤度ai,下面m行数据(a,b)表示的是a,b两个位置同时能够得到a到b所花的时间为(a-b)^3,然后再给q个数据x,问从第一个城市到达第x个城市所花的时间,如果不能到达,或者时间小于3输出?否则输出所花的时间思路;这个题目是存在负环的,所以常规的判别负环是不能够 get over it所以我们可以用SPFA算法来搞一波事情;只要标记的位置访问的次数达到n+1次,那么就说明存在负环;*/#include<cstdio>#include<cstring>#include<queue>using namespace std;const int maxn=3e4+7;///通过这个题我深刻的认识到原来light oj 的re是判定为WA;坑惨了; const int inf=0x3f3f3f3f;int head[maxn],point[maxn],dis[maxn],num[maxn];bool vis[maxn];int n,m;struct node{    int to,w,next;}eage[maxn];///自从用上SPFA,立刻就是前向星见建图了,真的是好用,现在全家都用它,它也很烦了吧;void Add(int i,int u,int v,int w){    eage[i].to=v;    eage[i].w=w;    eage[i].next=head[u];    head[u]=i;}int busyness(int a,int b){    int t=point[b]-point[a];    return t*t*t;}void SPFA()///用队列维护的SPFA;{    for(int i=1;i<=n;i++)    {        vis[i]=false;        dis[i]=inf;        num[i]=0;    }    dis[1]=0;    vis[1]=true;    num[1]++;    queue<int>Q;    Q.push(1);    while(!Q.empty())    {        int u=Q.front();        Q.pop();        if(num[u]>n+1){vis[u]=true;continue;}///判负环最关键的操作;        ///将每一个位置访问的次数进行统计,只需要超过n+1,那么肯定存负环;        vis[u]=false;        for(int i=head[u];i!=-1;i=eage[i].next)        {            int v=eage[i].to;            if(dis[v]>dis[u]+eage[i].w)            {                dis[v]=dis[u]+eage[i].w;                if(!vis[v])                {                    Q.push(v);                    vis[v]=true;                    num[v]++;                }            }        }    }}int main (){    int t;    scanf("%d",&t);    for(int cas=1;cas<=t;cas++)    {        scanf("%d",&n);        for(int i=1;i<=n;i++)        {            scanf("%d",&point[i]);            head[i]=-1;        }        scanf("%d",&m);        for(int i=1;i<=m;i++)        {            int a,b;            scanf("%d %d",&a,&b);            int w=busyness(a,b);            Add(i,a,b,mmm);        }        SPFA();        int q;        scanf("%d",&q);        printf("Case %d:\n",cas);        for(int i=1;i<=q;i++)        {            int x;            scanf("%d",&x);            if(dis[x]==inf||dis[x]<3) printf("?\n");///输出问号的条件嘛;            else printf("%d\n",dis[x]);        }    }    return 0;}
原创粉丝点击