zoukankan      html  css  js  c++  java
  • HDU 4109 Instrction Arrangement

    题意:给你一些机器指令,某些有先后顺序(若A->B,C->B则必须A、C执行完才能执行B),且有安全距离(若A->B 距离n)那么必须在从A执行算起n时间,才能执行B,一次可以运行多个指令,指令的完成只花费1,最后求执行完所有指令所需的最短的时间。

    思想:① 求所有入度为0的点的“最短路”,这里的最短路其实是求最长路(dist[N]->0;dist[v]+map[v][u]>dist[u])!!!

            ② 求出拓扑序列,计算出所有序列的最大值(这里就是最后一个执行玩的时间,最大时间)

    View Code
    ///WA 没过 错误的
    ///改改AC了!我都不敢相信!!O__O"…
    ///我怎么感觉好像有漏洞一样啊,但是却过了!!什么情况?

    #include <stdio.h>
    #include <string.h>

    #define N 1002
    #define M 10000
    #define MAXTIME 0
    #define MOVE(x) (x=(x+1)%N)

    int nodev[N];
    int nodeu[M],data[M],next[M];
    bool indegree[N];
    bool outdegree[N];
    int stack[N],top;

    void Build_Graph(int m)
    {
    int i,v,u,value,ind;

    memset(nodev,-1,sizeof(nodev)); ind=0;
    memset(indegree,false,sizeof(indegree));
    memset(outdegree,false,sizeof(outdegree));

    for(i=1;i<=m;i++)
    {
    scanf("%d %d %d",&v,&u,&value);
    indegree[u]=true; outdegree[v]=true;
    ind++;
    next[ind]=nodev[v];
    nodeu[ind]=u;
    data[ind]=value;
    nodev[v]=ind;
    }

    }

    void getStack(int n)
    {
    int i;
    for(top=i=0;i<n;i++)
    {
    if(!indegree[i] && outdegree[i])
    stack[top++]=i;
    }
    }

    int queue[N];
    bool flag[N];
    int time[N];
    int start,mintime;
    void SPFA(int s,int n)
    {
    int i,v,u,value,front,rear;

    for(i=1;i<=n;i++) time[i]=MAXTIME;
    front=-1; rear=-1; time[s]=0;
    memset(flag,false,sizeof(flag));
    for(i=nodev[s];i!=-1;i=next[i])
    {
    u=nodeu[i]; value=data[i];
    time[u]=value;
    queue[MOVE(rear)]=u;
    flag[u]=true;
    }

    while(front!=rear)
    {
    v=queue[MOVE(front)];
    flag[v]=false;
    for(i=nodev[v];i!=-1;i=next[i])
    {
    u=nodeu[i]; value=data[i];
    if(time[v]+value>time[u])
    {
    time[u]=time[v]+value;
    if(!flag[u])
    {
    queue[MOVE(rear)]=u;
    flag[u]=true;
    }
    }
    }
    }

    }
    int solve(int n)
    {
    int i,k,v,temp;

    getStack(n); mintime=MAXTIME;
    for(k=0;k<top;k++)
    {
    v=stack[k];
    SPFA(v,n);

    for(temp=i=0;i<n;i++)
    {
    if(time[i]>temp)
    temp=time[i];
    }
    if(temp>mintime)
    {
    mintime=temp;
    }
    }
    return mintime+1;
    }

    int main()
    {
    int n,m;
    // freopen("input.txt","r",stdin);
    while(scanf("%d %d",&n,&m)!=EOF)
    {

    Build_Graph(m);
    printf("%d\n",solve(n));

    }

    return 0;
    }
  • 相关阅读:
    java 集合框架
    java 迭代器遍历List Set Map
    java 容器 List
    OpenLayer4实现卷帘效果
    python结合百度api进行地理编码和爬取POI点
    ArcGIS API For JS空间参考系的浅析
    OpenLayer4加载svg
    OpenLayer3动态点线和动态点的扩散实现
    LeaFlet学习之地图文字标注
    装饰器设计模式
  • 原文地址:https://www.cnblogs.com/fornever/p/2243542.html
Copyright © 2011-2022 走看看