nyist 510昂贵的聘礼

/*
好好的图论题啊,最短路的应用,dijkstra算法 
*/
#include <iostream>
using namespace std;
const int INF=100000;
int a[105][105],b[105],c[105],s[105],dist[105];
int n,m;
int dj(int p,int q)
{
	int i,j,r,t,k=0;
	for(i=0;i<n;i++)
	if((b[i]>=p&&b[i]<=q)) dist[i]=a[k][i], s[i]=0; else dist[i]=INF,s[i]=0;
	dist[0]=0; s[0]=1;
	for(i=1;i<n;i++)
	{
		t=INF;
		for(j=0;j<n;j++)
		if(!s[j]&&dist[j]<t) t=dist[j],k=j;
		s[k]=1;
		for(j=0;j<n;j++)
		if(!s[j]&&a[k][j]<INF&&b[j]>=p&&b[j]<=q)
		{
			r=dist[k]+a[k][j];
			if(dist[j]>r) dist[j]=r;
		}
	}
	t=c[0];
	for(i=0;i<n;i++)
    if(dist[i]+c[i]<t) t=dist[i]+c[i];
		return t;
}
int main(int argc, char *argv[])
{
	int i,j,k,p,q,l,r;
	while(cin>>m>>n&&(m||n))
	{
		for(i=0;i<n;i++)
		for(j=0;j<n;j++)
		a[i][j]=INF;
	for(i=0;i<n;i++)
	{
		
		cin>>c[i]>>b[i]>>k;
	    for(j=0;j<k;j++)
	    {
	    cin>>p>>q;
	    a[i][p-1]=q;
	    }
	}
	r=c[0];
     for(i=b[0]-m;i<=b[0];i++)
     {
	 k=dj(i,i+m);
	 if(k<r) r=k;
     }
     cout<<r<<endl;
	}
	return 0;
}        


原文地址:https://www.cnblogs.com/james1207/p/3265371.html