zoukankan      html  css  js  c++  java
  • [Usaco2005]Part Acquisition

    Description

    The cows have been sent on a mission through space to acquire a new milking machine for their barn. They are flying through a cluster of stars containing N (1 <= N <= 50,000) planets, each with a trading post. The cows have determined which of K (1 <= K <= 1,000) types of objects (numbered 1..K) each planet in the cluster desires, and which products they have to trade. No planet has developed currency, so they work under the barter system: all trades consist of each party trading exactly one object (presumably of different types). The cows start from Earth with a canister of high quality hay (item 1), and they desire a new milking machine (item K). Help them find the best way to make a series of trades at the planets in the cluster to get item K. If this task is impossible, output -1.

    有n个星球,开始你的手中有1号物品,每个星球会帮你把物品a换成物品b,问你要得到物品m最少要换几次,如果怎么样都不能换到,输出-1
    

    Input

    • Line 1: Two space-separated integers, N and K. * Lines 2..N+1: Line i+1 contains two space-separated integers, a_i and b_i respectively, that are planet i's trading trading products. The planet will give item b_i in order to receive item a_i.

    Output

    • Line 1: One more than the minimum number of trades to get the milking machine which is item K (or -1 if the cows cannot obtain item K).

    Sample Input

    6 5 //6个星球,希望得到5,开始时你手中有1号物品.

    1 3 //1号星球,帮你把1号物品换成3号

    3 2

    2 3

    3 1

    2 5

    5 4

    Sample Output

    4


    这题裸的最短路,什么都不用想

    #include<cmath>
    #include<cstdio>
    #include<cstring>
    #include<iostream>
    #include<algorithm>
    #define inf 0x3f3f3f3f
    using namespace std;
    typedef long long ll;
    typedef unsigned int ui;
    typedef unsigned long long ull;
    inline int read(){
    	int x=0,f=1;char ch=getchar();
    	for (;ch<'0'||ch>'9';ch=getchar())	if (ch=='-')    f=-1;
    	for (;ch>='0'&&ch<='9';ch=getchar())	x=(x<<1)+(x<<3)+ch-'0';
    	return x*f;
    }
    inline void print(int x){
    	if (x>=10)     print(x/10);
    	putchar(x%10+'0');
    }
    const int N=5e4;
    int pre[N+10],now[N+10],child[N+10];
    int h[N+10],dis[N+10];
    bool vis[N+10];
    int tot,n,End,root=1;
    void join(int x,int y){pre[++tot]=now[x],now[x]=tot,child[tot]=y;}
    void SPFA(int x){
    	int head=0,tail=1;
    	memset(dis,63,sizeof(dis));
    	h[1]=x,vis[x]=1,dis[x]=1;
    	while (head!=tail){
    		if (++head>N)	head=1;
    		int Now=h[head];
    		for (int p=now[Now],son=child[p];p;p=pre[p],son=child[p])
    			if (dis[son]>dis[Now]+1){
    				dis[son]=dis[Now]+1;
    				if (!vis[son]){
    					if (++tail>N)	tail=1;
    					h[tail]=son,vis[son]=1;
    				}
    			}
    		vis[Now]=0;
    	}
    }
    int main(){
    	n=read(),End=read();
    	for (int i=1,x,y;i<=n;i++)	x=read(),y=read(),join(x,y);
    	SPFA(root);
    	dis[End]!=inf?printf("%d
    ",dis[End]):printf("-1
    ");
    	return 0;
    }
    
  • 相关阅读:
    Android开发 GradientDrawable详解
    Android开发 ShapeDrawable详解
    Android开发 ViewPager删除Item后,不会更新数据和View
    Android开发 输入法调用学习
    Android开发 EditText的开发记录
    Android开发 TextView的开发记录
    Android开发 获取View的尺寸的2个方法
    Android开发 获取视频中的信息(例如预览图或视频时长) MediaMetadataRetriever媒体元数据检索器
    Android开发 Tablayout的学习
    Python 模块-zipfile
  • 原文地址:https://www.cnblogs.com/Wolfycz/p/8411137.html
Copyright © 2011-2022 走看看