AOE关键路径

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

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

#include <string.h>
#include <stdio.h>
#include <stdlib.h>
#include <algorithm>
using namespace std;
#define Max 55555
struct 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];
   }
}



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值