锘??xml version="1.0" encoding="utf-8" standalone="yes"?>
#include聽(tīng)<cstdio>
#include聽(tīng)<cstdlib>
#include聽(tīng)<queue>
#include聽(tīng)<deque>
using聽(tīng)namespace聽(tīng)std;

struct聽(tīng)Node聽(tīng)
{
聽(tīng)聽(tīng)聽(tīng)聽(tīng)int聽(tīng)to;
聽(tīng)聽(tīng)聽(tīng)聽(tīng)int聽(tīng)weight;
聽(tīng)聽(tīng)聽(tīng)聽(tīng)Node聽(tīng)*next;
};
#define聽(tīng)MAXFIELD聽(tīng)(1000聽(tīng)+聽(tīng)10)
#define聽(tīng)MAXPATH聽(tīng)(2500聽(tīng)+聽(tīng)10)
#define聽(tīng)MAXWORMHOLE聽(tīng)(200聽(tīng)+聽(tīng)10)
Node聽(tīng)nodeHead[MAXFIELD];
Node聽(tīng)nodes[MAXPATH聽(tīng)*聽(tīng)2聽(tīng)+聽(tīng)MAXWORMHOLE];
int聽(tīng)dis[MAXFIELD聽(tīng)+聽(tīng)1];
bool聽(tīng)isInQueue[MAXFIELD聽(tīng)+聽(tīng)1];
int聽(tīng)allocPos聽(tīng)=聽(tīng)0;
Node聽(tīng)*getNode()聽(tīng)
{
聽(tīng)聽(tīng)聽(tīng)聽(tīng)return聽(tīng)nodes聽(tīng)+聽(tīng)allocPos++;
}
void聽(tīng)initGraph(int聽(tīng)n)聽(tīng)
{
聽(tīng)聽(tīng)聽(tīng)聽(tīng)allocPos聽(tīng)=聽(tīng)0;
聽(tīng)聽(tīng)聽(tīng)聽(tīng)int聽(tīng)i聽(tīng)=聽(tīng)0;
聽(tīng)聽(tīng)聽(tīng)聽(tīng)for聽(tīng)(i聽(tīng)=聽(tīng)0;聽(tīng)i聽(tīng)<聽(tīng)n;聽(tīng)++i)聽(tīng)
{
聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng)nodeHead[i].next聽(tīng)=聽(tīng)NULL;
聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng)dis[i]聽(tīng)=聽(tīng)0;
聽(tīng)聽(tīng)聽(tīng)聽(tīng)}
}
void聽(tīng)addEdge(int聽(tīng)from,聽(tīng)int聽(tīng)to,聽(tīng)int聽(tīng)timeNeed)聽(tīng)
{
聽(tīng)聽(tīng)聽(tīng)聽(tīng)Node聽(tīng)*newNode聽(tīng)=聽(tīng)getNode();
聽(tīng)聽(tīng)聽(tīng)聽(tīng)newNode->next聽(tīng)=聽(tīng)nodeHead[from].next;
聽(tīng)聽(tīng)聽(tīng)聽(tīng)newNode->to聽(tīng)=聽(tīng)to;
聽(tīng)聽(tīng)聽(tīng)聽(tīng)newNode->weight聽(tīng)=聽(tīng)timeNeed;
聽(tīng)聽(tīng)聽(tīng)聽(tīng)nodeHead[from].next聽(tīng)=聽(tīng)newNode;
}

int聽(tīng)main()聽(tīng)
{
聽(tīng)聽(tīng)聽(tīng)聽(tīng)int聽(tīng)caseCount,聽(tīng)fieldCount,聽(tīng)pathCount,聽(tīng)wormHoleCount;
聽(tīng)聽(tīng)聽(tīng)聽(tīng)int聽(tīng)i,聽(tīng)j,聽(tīng)from,聽(tīng)to,聽(tīng)timeNeed;
聽(tīng)聽(tīng)聽(tīng)聽(tīng)scanf("%d",聽(tīng)&caseCount);
聽(tīng)聽(tīng)聽(tīng)聽(tīng)for聽(tīng)(i聽(tīng)=聽(tīng)0;聽(tīng)i聽(tīng)<聽(tīng)caseCount;聽(tīng)i++)聽(tīng)
{
聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng)scanf("%d%d%d",聽(tīng)&fieldCount,聽(tīng)&pathCount,聽(tīng)&wormHoleCount);
聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng)initGraph(fieldCount聽(tīng)+聽(tīng)1);
聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng)for聽(tīng)(j聽(tīng)=聽(tīng)0;聽(tīng)j聽(tīng)<聽(tīng)pathCount;聽(tīng)j++)聽(tīng)
{
聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng)scanf("%d%d%d",聽(tīng)&from,聽(tīng)&to,聽(tīng)&timeNeed);
聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng)addEdge(from,聽(tīng)to,聽(tīng)timeNeed);
聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng)addEdge(to,聽(tīng)from,聽(tīng)timeNeed);
聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng)}
聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng)for聽(tīng)(j聽(tīng)=聽(tīng)0;聽(tīng)j聽(tīng)<聽(tīng)wormHoleCount;聽(tīng)++j)聽(tīng)
{
聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng)scanf("%d%d%d",聽(tīng)&from,聽(tīng)&to,聽(tīng)&timeNeed);
聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng)addEdge(from,聽(tīng)to,聽(tīng)-timeNeed);
聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng)}
聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng)//聽(tīng)鍏抽敭:聽(tīng)鎸夌収棰樼洰鐨勮姹?聽(tīng)鍙互鐪嬪嚭鏄壘鍥句腑鏈夋病鏈夎礋鐜?br />
聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng)//聽(tīng)寮曞叆涓涓秴綰х偣s,聽(tīng)s鑳藉鍒拌揪浠繪剰涓涓猣ield,聽(tīng)浣嗘槸娌℃湁浠諱綍field鑳藉鍒拌揪s
聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng)//聽(tīng)鐒跺悗濡傛灉鍥句腑涓嶅瓨鍦ㄨ礋鐜?聽(tīng)鍒欏湪緇忚繃fieldCount嬈℃澗寮?鎴戝彨浼樺寲)浠ュ悗,聽(tīng)
聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng)//聽(tīng)灝辨病鏈夊姙娉曚嬌浠繪剰涓涓猣ield鑺傜偣鐨勬潈鍊煎彉灝忎簡(jiǎn),聽(tīng)鑰屽鏋滃瓨鍦ㄨ礋鐜?聽(tīng)
聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng)//聽(tīng)鍒欒繕鑳芥澗寮?浼樺寲.
聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng)//聽(tīng)榪欏氨鏄負(fù)浠涔堝垵濮嬪寲鏃墮渶瑕佹妸鎵鏈夌殑field閮藉帇鍏ラ槦鍒?
聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng)deque<int>聽(tīng)q;
聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng)for聽(tīng)(j聽(tīng)=聽(tīng)1;聽(tīng)j聽(tīng)<=聽(tīng)fieldCount;聽(tīng)++j)聽(tīng)
{
聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng)q.push_back(j);
聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng)isInQueue[j]聽(tīng)=聽(tīng)true;
聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng)}
聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng)bool聽(tīng)answer聽(tīng)=聽(tīng)false;
聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng)int聽(tīng)round聽(tīng)=聽(tīng)0;
聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng)while聽(tīng)(!q.empty())聽(tīng)
{
聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng)int聽(tīng)n聽(tīng)=聽(tīng)q.size();
聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng)for聽(tīng)(j聽(tīng)=聽(tīng)0;聽(tīng)j聽(tīng)<聽(tīng)n;聽(tīng)j++)聽(tīng)
{
聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng)int聽(tīng)u聽(tīng)=聽(tīng)q.front();
聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng)q.pop_front();
聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng)isInQueue[u]聽(tīng)=聽(tīng)false;
聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng)Node聽(tīng)*tra;
聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng)for聽(tīng)(tra聽(tīng)=聽(tīng)nodeHead[u].next;聽(tīng)tra聽(tīng)!=聽(tīng)NULL;聽(tīng)tra聽(tīng)=聽(tīng)tra->next)聽(tīng)
{
聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng)int聽(tīng)temp聽(tīng)=聽(tīng)tra->weight聽(tīng)+聽(tīng)dis[u];
聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng)if聽(tīng)(temp聽(tīng)<聽(tīng)dis[tra->to])聽(tīng)
{
聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng)dis[tra->to]聽(tīng)=聽(tīng)temp;
聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng)if聽(tīng)(!isInQueue[tra->to])聽(tīng)
{
聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng)q.push_back(tra->to);
聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng)isInQueue[tra->to]聽(tīng)=聽(tīng)true;
聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng)}
聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng)}
聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng)}
聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng)}
聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng)round++;
聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng)if聽(tīng)(round聽(tīng)>聽(tīng)fieldCount)聽(tīng)
{
聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng)answer聽(tīng)=聽(tīng)true;
聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng)q.clear();
聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng)break;
聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng)}
聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng)}

聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng)if聽(tīng)(answer)聽(tīng)
{
聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng)puts("YES");
聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng)}
聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng)else聽(tīng)
{
聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng)puts("NO");
聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng)}
聽(tīng)聽(tīng)聽(tīng)聽(tīng)}
聽(tīng)聽(tīng)聽(tīng)聽(tīng)return聽(tīng)0;
}
]]>
// 鍔炴硶: 鏋氫婦--鍋囪鏌愮鏂規(guī)鏄渶鐪侀挶鐨?
// 鍒欒鏂規(guī)涓殑鎵鏈変氦鏄撹呯殑鍦頒綅絳夌駭閮戒細(xì)钀藉湪涓涓搴︿負(fù)rankLimit鐨勫尯闂?br />// 浜庢槸鍙互鏋氫婦榪欎釜鍖洪棿:
// [ownerRank[1] - rankLimit, ownerRank] ~ [ownerRank[1], ownerRank + rankLimit]
// 浜庢槸榪欓亾棰樿冨療浜?jiǎn)鏈鐭礬鐨刣ijkstra綆楁硶涓庢灇涓劇殑緇撳悎.
//
// 鍏朵腑鏋氫婦鍙鏄渶瑕佽冨療鍏跺鏉傚害鐨?
// dijkstra綆楁硶鐨勫鏉傚害涓? O(n * n), n涓鴻妭鐐規(guī)暟鐩?br />// 鏋氫婦閲忎負(fù) rankLimit + 1;
// 浜庢槸鏋氫婦 + dijkstra鐨勭畻娉曞鏉傚害涓?nbsp;O(n * n) * (rankLimit + 1)
// 鍏抽敭2: 鐢遍鎰忚鑱旀兂鍒扮敤鏈鐭礬, 鑰屼笖鏄竟鏉冧負(fù)姝g殑鏈鐭礬
// 1) 浠ョ墿鍝佷負(fù)鍥捐妭鐐?br />// 2) 璁緄鐗╁搧濡傛灉鑳界敤j鐗╁搧浠ヤ環(huán)鏍糾浜ゆ崲, 鍒欒竟(i,j)鐨勬潈鍊間負(fù)m
// 3) 璁炬眰寰楄妭鐐?鍒扮墿鍝亁鐨勬渶鐭礬, 璇ユ渶鐭礬鐨勬潈鍊煎拰涓簍w(total weight鐨勭緝鍐?,
// 鍒欎粠鐗╁搧x寮濮嬬墿鐗╀氦鎹㈢殑鎵鏈夋柟妗堜腑, 鏈鑺傜渷鐨勬柟妗堜細(xì)鑰楄垂tw + price[x]鐨勯噾閽?br />// 鑰屽紺兼渶灝戦渶瑕佺殑閲戝竵鏁板氨鏄墍鏈?nbsp;1 <= x <= goodsCount 涓?
// tw[1][x] + price[x]鏈灝忕殑閭d釜. (tw[1][x]琛ㄧず1鍒皒鐨勬渶鐭礬寰勬潈鍊?
// 浼樺寲1: 鍦╠ijkstra綆楁硶鐨勪唬鐮侀儴鍒? 闇瑕佸鍘熺偣鍒拌妭鐐圭殑鏈灝忚窛紱繪槸鍚﹀凡鐭ヤ綔鍑哄垽鏂?
// 榪欎釜鍒ゆ柇鏄敤bool鏁扮粍disKnown鏉ュ垽鏂殑, 嫻垂澶ч噺鏃墮棿.
// 鍙互浼樺寲涓烘坊鍔犱竴涓暟緇? 鐢ㄨ鏁扮粍淇濆瓨鏈灝忚窛紱繪湭鐭ョ殑鑺傜偣鐨勭紪鍙?
// 鍙鐞嗘暟緇勪腑鐨勮妭鐐?
#include <cstdio>
using namespace std;
struct Node {
int to;
int weight;
Node *next;
};
#define INF (1 << 30)
#define MAXNODE (100 + 10)
#define MAXEDGE (MAXNODE * MAXNODE + 10)
Node nodeHead[MAXNODE + 1];
Node nodes[MAXEDGE];
int ownerRank[MAXNODE + 1];
int price[MAXNODE + 1];
int minWeight[MAXNODE + 1];
bool disKnown[MAXNODE + 1];
int allocPos = 0;
Node *getNode() {
return nodes + allocPos++;
}
void initGraph(int n) {
allocPos = 0;
int i = 0;
for (i = 0; i < n; ++i) {
nodeHead[i].next = NULL;
minWeight[i] = INF;
}
}
void addEdge(int from, int to, int weight) {
Node *newNode = getNode();
newNode->next = nodeHead[from].next;
newNode->to = to;
newNode->weight = weight;
nodeHead[from].next = newNode;
}
int main() {
int rankLimit, goodsCount, substituteCount, subPrice, num, minPrice, minWei;
int minWeiPos;
int i, j, rankStart;
scanf("%d%d", &rankLimit, &goodsCount);
initGraph(goodsCount + 1);
for (i = 1; i <= goodsCount; ++i) {
scanf("%d%d%d", price + i, ownerRank + i, &substituteCount);
for (j = 0; j < substituteCount; ++j) {
scanf("%d%d", &num, &subPrice);
addEdge(i, num, subPrice);
}
}
minPrice = price[1];
for (rankStart = ownerRank[1] - rankLimit; rankStart <= ownerRank[1]; rankStart++) {
for (i = 1; i <= goodsCount; ++i) {
minWeight[i] = INF;
// 濡傛灉鏌愪釜鑺傜偣/鍟嗗搧鎷ユ湁鑰呯殑闃剁駭鍦頒綅涓嶅湪[rankStart, rankStart + rankLimit]
// 鐨勮寖鍥村唴, 灝變笉蹇呰冭檻璇ヨ妭鐐?br /> if (ownerRank[i] < rankStart || ownerRank[i] > rankStart + rankLimit) {
disKnown[i] = true;
}
else {
disKnown[i] = false;
}
}
disKnown[1] = false;
minWeight[1] = 0;
for (i = 1; i <= goodsCount; ++i) {
minWei = INF;
for (j = 1; j <= goodsCount; ++j) {
if (!disKnown[j] && minWeight[j] < minWei) {
minWei = minWeight[j];
minWeiPos = j;
}
}
disKnown[minWeiPos] = true;
if (minWei + price[minWeiPos] < minPrice) {
minPrice = minWei + price[minWeiPos];
}
for (Node *tra = nodeHead[minWeiPos].next; tra != NULL; tra = tra->next) {
if (!disKnown[tra->to] &&
minWeight[tra->to] > minWeight[minWeiPos] + tra->weight ) {
minWeight[tra->to] = minWeight[minWeiPos] + tra->weight;
}
}
}
}
printf("%d\n", minPrice);
return 0;
}
浼樺寲鍚? 閫熷害瑕佸揩涓浜? 浣嗘槸浠g爜姣旇緝闅劇湅, 瀵瑰彉閲忕殑鍛藉悕璁╀漢姣旇緝鎭肩伀:
using namespace std;
struct Node {
int to;
int weight;
Node *next;
};
#define INF (1 << 30)
#define MAXNODE (100 + 10)
#define MAXEDGE (MAXNODE * MAXNODE + 10)
Node nodeHead[MAXNODE + 1];
Node nodes[MAXEDGE];
int ownerRank[MAXNODE + 1];
int price[MAXNODE + 1];
int minWeight[MAXNODE + 1];
int distanceUnknown[MAXNODE + 1];
int distanceUnknownCount;
bool isDistanceKnown[MAXNODE + 1];
int allocPos = 0;
Node *getNode() {
return nodes + allocPos++;
}
void initGraph(int n) {
allocPos = 0;
int i = 0;
for (i = 0; i < n; ++i) {
nodeHead[i].next = NULL;
minWeight[i] = INF;
}
}
void addEdge(int from, int to, int weight) {
Node *newNode = getNode();
newNode->next = nodeHead[from].next;
newNode->to = to;
newNode->weight = weight;
nodeHead[from].next = newNode;
}
int main() {
int rankLimit, goodsCount, substituteCount, subPrice, num, minPrice, minWei;
int minWeiDisUnkPos;
int i, j, from;
scanf("%d%d", &rankLimit, &goodsCount);
initGraph(goodsCount + 1);
for (i = 1; i <= goodsCount; ++i) {
scanf("%d%d%d", price + i, ownerRank + i, &substituteCount);
for (j = 0; j < substituteCount; ++j) {
scanf("%d%d", &num, &subPrice);
addEdge(i, num, subPrice);
}
}
minPrice = price[1];
for (from = ownerRank[1] - rankLimit; from <= ownerRank[1]; from++) {
for (i = 1; i <= goodsCount; ++i) {
minWeight[i] = INF;
}
distanceUnknownCount = 0;
for (i = 1; i <= goodsCount; ++i) {
if (ownerRank[i] >= from && ownerRank[i] <= from + rankLimit) {
distanceUnknown[distanceUnknownCount++] = i;
isDistanceKnown[i] = false;
}
else {
isDistanceKnown[i] = true;
}
}
minWeight[1] = 0;
isDistanceKnown[1] = false;
int n = distanceUnknownCount;
for (i = 0; i < n; ++i) {
minWei = INF;
for (j = 0; j < distanceUnknownCount; ++j) {
if (minWeight[ distanceUnknown[j] ] < minWei) {
minWei = minWeight[ distanceUnknown[j] ];
minWeiDisUnkPos = j;
}
}
if (minWei + price[ distanceUnknown[minWeiDisUnkPos] ] < minPrice) {
minPrice = minWei + price[ distanceUnknown[minWeiDisUnkPos] ];
}
for (Node *tra = nodeHead[ distanceUnknown[minWeiDisUnkPos] ].next; tra != NULL; tra = tra->next) {
if (!isDistanceKnown[tra->to] &&
minWeight[tra->to] > minWeight[ distanceUnknown[minWeiDisUnkPos] ] + tra->weight ) {
minWeight[tra->to] = minWeight[ distanceUnknown[minWeiDisUnkPos] ] + tra->weight;
}
}
isDistanceKnown[ distanceUnknown[minWeiDisUnkPos] ] = true;
distanceUnknown[minWeiDisUnkPos] = distanceUnknown[--distanceUnknownCount];
}
}
printf("%d\n", minPrice);
return 0;
}
]]>
]]>