AOE关键路径

来源:互联网 发布:密度聚类算法处理轨迹 编辑:程序博客网 时间:2024/06/08 19:55

    哈哈哈,今天晚上哈,这些天一直在训练但是感觉自己没怎么长进,因为个人赛的时候总是爆零,但是今天晚上我看了一下曾经让我头疼不以的AOE路径,我竟然先看算法

然后写了一下,竟然一发A掉了,感觉没难度哈哈哈,好了不吹了,下面就是我写的一道简单的AOE小板子,可能哈,鄙人是一个小菜鸡有些地方写的不是多好,如果大家看出来了就跟我说一下;

#include <string.h>#include <stdio.h>#include <stdlib.h>#include <algorithm>using namespace std;#define Max 55555struct node{   int u,v,w;}Edge[Max];void Bellman(int n,int m);int path[Max],dis[Max],in[Max],out[Max];int n,m,s;int main(){    while(scanf("%d %d",&n,&m)!=EOF)    {        memset(in,0,sizeof(in));        memset(out,0,sizeof(out));        for(int i=0;i<m;i++)        {           int a,b,c;           scanf("%d %d %d",&a,&b,&c);           Edge[i].u=a;           Edge[i].v=b;           Edge[i].w=c;           out[a]++;           in[b]++;        }        for(int i=1;i<=n;i++)        {           if(in[i]==0)           {             s=i;             break;           }        }//        printf("%d\n",s);        Bellman(n,m);    }    return 0;}void Bellman(int n, int m)//最短路的Bellman动态松弛思想;{   memset(dis,0,sizeof(dis));   memset(path,0,sizeof(path));   for(int j=1;j<n;j++)   {      int f=0;      for(int i=0;i<m;i++)      {         if(dis[Edge[i].u]<dis[Edge[i].v]+Edge[i].w||(dis[Edge[i].u]==dis[Edge[i].v]+Edge[i].w&&Edge[i].v<path[Edge[i].u]))         {           f=1;           dis[Edge[i].u]=dis[Edge[i].v]+Edge[i].w;           path[Edge[i].u]=Edge[i].v;         }      }//因为找最大的路径长度,所以经过的点是不确定的,但是有一点是确定的就是出发点是,      if(!f)//源点,结束点是会点;所以不从哪一个开始都可以进行不断的松弛,知道没有电再能松弛是结束;      {//        break;      }   }//这个地方用的是源点为出发点,上面是到变得出发点的松弛,但是如果是从结束点开始的话就是   int k=s;//到汇点的松弛,只不过这样的话那个路径保存护士倒着的,可以再用数组处理一下;   printf("%d\n",dis[s]);   while(path[k]!=0)//很骚的一布操作,用来打印路径的;   {       printf("%d %d\n",k,path[k]);       k=path[k];   }}