【POJ 1062昂贵的聘礼 】



将Input转化成图,求解最短路径问题


#include<iostream>
using namespace std;
#include<memory.h>
#include<limits.h>

int Graph[105][105];
bool mark[105];
int v[105];
int grade[105];
int nodeal;
int M,N,quizhangL;


int getMin()
{
	int temp,i;
	for(i=0;i<N+1;i++)
	{
		if(mark[i]==0&&grade[i]>=(quizhangL-M))
		{
			temp=i;
			break;
		}
	}
	for(int k=i+1;k<N+1;k++)
	{
		
		if(mark[k]==0&&grade[k]>=(quizhangL-M)&&v[k]<v[temp])
		{
			temp=k;
		}
	}
	return temp;
}

int first(int v)
{
	for(int i=0;i<N+1;i++)
	{
		if(Graph[v][i]!=0)
		{ 
			return i;
		}
	}
	return N+2;
}

int next(int v,int w)
{
	for(int i=w+1;i<N+1;i++)
	{
		if(Graph[v][i]!=0)
		{
			return i;
		}
	}
	return N+2;
}

void Dijkstral()
{
	int min=getMin();
	mark[min]=1;
	for(int i=first(min);i<N+1;i=next(min,i))
	{
		if(v[i]>v[min]+Graph[min][i])
		{
			v[i]=v[min]+Graph[min][i];
		}
	}
}

int main(void)
{
	while(~scanf("%d %d",&M,&N))
	{
		int P,L,X;
		int temp;
		memset(mark,0,sizeof(mark[0])*(N+2));
		for(int i=0;i<N+1;i++)
		{
			v[i]=100000;
		}
		v[0]=0;
		for(int i=0;i<N+1;i++)
		{
			memset(Graph[i],0,sizeof(Graph[i][0])*(N+1));
		}
		for(int i=0;i<N;i++)
		{
			cin>>P>>L>>X;
			if(i==0)
			{
				quizhangL=L;
				grade[0]=L;
				Graph[0][N]=P;
				Graph[N][0]=P;
				for(int k=0;k<X;k++)
				{
					int tempnum,tempP;
					cin>>tempnum>>tempP;
					Graph[tempnum-1][N]=tempP;
					Graph[N][tempnum-1]=tempP;
				}
			}
			else
			{
				Graph[0][i]=P;
				Graph[i][0]=P;
				grade[i]=L;
				for(int k=0;k<X;k++)
				{
					int tempnum,tempP;
					cin>>tempnum>>tempP;
					Graph[tempnum-1][i]=tempP;
					Graph[i][tempnum-1]=tempP;
				}
			}
			if(L<quizhangL-M)
			{
				nodeal++;
			}
		}
		for(int i=0;i<N+1-nodeal;i++)
		{
			Dijkstral();
		}
		cout<<v[N]<<endl;
	}
	return 0;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值