P1186 玛丽卡

P1186 玛丽卡


读题真的好恶心

实际上是考察了spfa中路径记录的问题

#include<cstdio>
#include<iostream>
#include<algorithm>
#include<queue>
using namespace std;
struct node
{
	int point;
	int nxt;
	int weight;
};
node line[1000000];
int head[1001],tail;
int dis[1010];
bool can[1010][1010];
bool inque[1010];
int pre[1010];
int n,m;
queue<int>q;
void add(int a,int b,int c)
{
	line[++tail].point=b;
	line[tail].nxt=head[a];
	line[tail].weight=c;
	head[a]=tail;
}
void spfa(int base)
{
	for(int i=2;i<=n;i++)
	{
		inque[i]=false;
		dis[i]=0x7ffffff;	
	}
	dis[1]=0;
	inque[1]=true;
	q.push(1);
	while(!q.empty())
	{
		int pass=q.front();
		q.pop();
		inque[pass]=false;
		for(int need=head[pass];need;need=line[need].nxt)
		{
			if(dis[line[need].point]>dis[pass]+line[need].weight&&!can[pass][line[need].point])
			{
				dis[line[need].point]=dis[pass]+line[need].weight;
				if(base)
					pre[line[need].point]=pass;
				if(!inque[line[need].point])
				{
					q.push(line[need].point);
					inque[line[need].point];
				}
			}
		}
	}
}
int main()
{
	scanf("%d%d",&n,&m);
	int a,b,c;
	for(int i=1;i<=m;i++)
	{
		scanf("%d%d%d",&a,&b,&c);
		add(a,b,c);
		add(b,a,c);
	}
	int maxn=-0x7fffffff;
	spfa(1);
	for(int i=n;i;i=pre[i])//倒叙便利十分好实现,如果是输出路径的话就可以再来一个stack了
	{
		can[i][pre[i]]=can[pre[i]][i]=true;
		spfa(0);
		maxn=max(dis[n],maxn);
		can[i][pre[i]]=can[pre[i]][i]=false;
	}
	printf("%d",maxn);
}
posted @ 2018-04-01 14:16  Lance1ot  阅读(142)  评论(0编辑  收藏  举报