哈哈哈,今天晚上哈,这些天一直在训练但是感觉自己没怎么长进,因为个人赛的时候总是爆零,但是今天晚上我看了一下曾经让我头疼不以的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];
}
}