poj 1062 最短路

2015/1/26


還是比較裸的最短路。

這題需要注意的地方就是地位等級差距限制 k      去做最短路算法的時候限制應該是一個包含族長地位的變化的區間(而不是 [m-k,m+k])


#include<map>
#include<queue>
#include<stack>
#include<cmath>
#include<vector>
#include<climits>
#include<stdio.h>
#include<string.h>
#include<iostream>
#include<algorithm>

using namespace std;
typedef long long ll;  

#define mod 10007
#define lson pos<<1,l,mid
#define sc(n) scanf("%d",&n)
#define rson pos<<1|1,mid+1,r
#define pr(n) printf("%d\n",n)
#define met(n,m) memset(n, m, sizeof(n))
#define F(x,y,i) for(int i = x;i > y; i--)
#define f(x,y,i) for(int i = x;i < y; i++)
#define ff(x,y,i) for(int i = x;i <= y; i++)
#define FF(x,y,i) for(int i = x;i >= y; i--) 

const int N=100500;
const int inf = INT_MAX;

int Max(int a,int b)
{
	return a>b?a:b;
}

int Min(int a,int b)
{
	return  a<b?a:b;
}

struct node{
	int v;
	int k;
}dis[1005];

struct edge{
	int from;
	int to;
	int v;
}s[10005];

int ds[1005];

int main()  
{  
    int kk ,k ,n, m, tot, x, y;
    while(~scanf("%d%d",&kk, &m))
    {
    	tot = 0;
      f(1,m+1,i)
      {
      	scanf("%d%d%d",&dis[i].v,&dis[i].k,&n);
      	f(0, n, j)
      	{
	      	scanf("%d%d", &x,&y);
	      	s[tot].from = i;
	      	s[tot].to = x;
	      	s[tot++].v = y;
      	}
      }
      
      int minn = dis[1].v;
      
      f(dis[1].k, kk+dis[1].k+1, k)
      {
      	f(1,m+1,i)
      	{
	      	ds[i] = dis[i].v;
	      }
      	f(0,m,i)
      	{
      		f(0,tot,j)
      		{
	      		if(dis[s[j].from].k <= k && dis[s[j].from].k >=k - kk  && dis[s[j].to].k <= k&& dis[s[j].to].k >= k - kk )
	      		{
	      			if(ds[s[j].from] > ds[s[j].to] + s[j].v)
	      			{
		      			ds[s[j].from] = ds[s[j].to] + s[j].v;
		      		}
	      		}
	      	}
      	}
      	minn = Min(minn,ds[1]);
      }
      
     
      printf("%d\n",minn);
		    	
    }
    return 0;  
}  
	


發佈了123 篇原創文章 · 獲贊 2 · 訪問量 5萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章