zoukankan      html  css  js  c++  java
  • Part Acquisition(spfa输出路径)

    Part Acquisition
    Time Limit: 1000MS   Memory Limit: 65536K
    Total Submissions: 4080   Accepted: 1742   Special Judge

    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.

    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). 

    * Lines 2..T+1: The ordered list of the objects that the cows possess in the sequence of trades.

    Sample Input

    6 5
    1 3
    3 2
    2 3
    3 1
    2 5
    5 4

    Sample Output

    4
    1
    3
    2
    5
    题意;母牛想用草换k星奶机;输出路径;bellman只是单纯的找dis的最小值,会陷入2 3,3 2循环
    spfa:
    #include<iostream>
    #include<cstdio>
    #include<cstring>
    #include<cmath>
    #include<vector>
    #include<algorithm>
    #include<stack>
    #include<queue>
    using namespace std;
    const int INF=0x3f3f3f3f;
    const double PI=acos(-1.0);
    typedef long long LL;
    #define mem(x,y) memset(x,y,sizeof(x))
    #define T_T while(T--)
    #define F(i,x) for(i=1;i<=x;i++)
    #define SI(x) scanf("%d",&x)
    #define SL(x) scanf("%lld",&x)
    #define PI(x) printf("%d",x)
    #define PL(x) printf("%lld",x)
    #define P_ printf(" ")
    const int MAXN=1010;
    const int MAXM=50010;
    int vis[MAXN],dis[MAXN],pre[MAXN];
    int head[MAXM];
    queue<int>S;
    int n,k,edgnum;
    struct Edge{
    	int from,to,next;
    }edg[MAXM];
    void initial(){
    	mem(head,-1);
    	edgnum=0;
    	mem(pre,0);
    }
    void add(int u,int v){
    	Edge E={u,v,head[u]};
    	edg[edgnum]=E;
    	head[u]=edgnum++;
    }
    void print(int x){
    	if(x==0)return;
    	print(pre[x]);
    	printf("%d
    ",x);
    }
    void spfa(int sx){
    	while(!S.empty())S.pop();
    	mem(vis,0);mem(dis,INF);
    	S.push(sx);vis[sx]=1;dis[sx]=1;
    	while(!S.empty()){
    		int u=S.front();
    		vis[u]=0;
    		S.pop();
    		for(int i=head[u];i!=-1;i=edg[i].next){
    			int v=edg[i].to;
    			if(dis[v]>dis[u]+1){
    				dis[v]=dis[u]+1;
    				if(!vis[v]){
    					pre[v]=u;
    					vis[v]=1;
    					S.push(v);
    				}
    			}
    		}
    	}
    	if(dis[k]==INF){
    		puts("-1");
    		return;
    	}
    	printf("%d
    ",dis[k]);
    	print(k);
    	return;
    }
    int main(){
    	  while(~scanf("%d%d",&n,&k)){
    	  	initial();
    	  	int i,j,u,v;
    	  	F(i,n){
    	  		scanf("%d%d",&u,&v);
    	  		add(u,v);
    		  }
    		  spfa(1);
    	  }
    	return 0;
    }
    

     bellman死循环:

    #include<iostream>
    #include<cstdio>
    #include<cstring>
    #include<cmath>
    #include<vector>
    #include<algorithm>
    using namespace std;
    const int INF=0x3f3f3f3f;
    const double PI=acos(-1.0);
    typedef long long LL;
    #define mem(x,y) memset(x,y,sizeof(x))
    #define T_T while(T--)
    #define F(i,x) for(i=1;i<=x;i++)
    #define SI(x) scanf("%d",&x)
    #define SL(x) scanf("%lld",&x)
    #define PI(x) printf("%d",x)
    #define PL(x) printf("%lld",x)
    #define P_ printf(" ")
    const int MAXN=50010;
    struct Node{
    	int u,v;
    }dt[MAXN<<1];
    int dis[MAXN],pre[MAXN];
    int edgnum;
    int n,k;
    void add(int u,int v){
    	dt[edgnum].u=u;
    	dt[edgnum++].v=v;
    }
    void print(int x){
    	if(pre[x]==0)return;
    	print(pre[x]);
    	printf("%d
    ",x);
    }
    int Bellman(int u){
    	mem(dis,INF);dis[u]=0;
    	for(int i=1;i<=k;i++){
    		int u,v;
    		for(int j=0;j<edgnum;j++){
    		//	dis[v]=min(dis[v],dis[u]+1);
    		if(dis[v]>dis[u]+1){
    			dis[v]=dis[u]+1;
    			pre[v]=u;
    			}	
    		}
    	}
    	if(dis[k]==INF)return -1;
    	print(k);
    	return dis[k];
    }
    int main(){
    	while(~scanf("%d%d",&n,&k)){
    		int i,j;
    		edgnum=0;
    		mem(pre,0);
    		F(i,n){
    			int u,v;
    			scanf("%d%d",&u,&v);
    			add(u,v);
    		}
    		printf("%d
    ",Bellman(1));
    	}
    	return 0;
    }
    

     dijkscra;不能输出路径。

    代码:

    #include<iostream>
    #include<cstdio>
    #include<cstring>
    #include<cmath>
    #include<vector>
    #include<algorithm>
    #include<stack>
    #include<queue>
    using namespace std;
    const int INF=0x3f3f3f3f;
    const double PI=acos(-1.0);
    typedef long long LL;
    #define mem(x,y) memset(x,y,sizeof(x))
    #define T_T while(T--)
    #define F(i,x) for(i=1;i<=x;i++)
    #define SI(x) scanf("%d",&x)
    #define SL(x) scanf("%lld",&x)
    #define PI(x) printf("%d",x)
    #define PL(x) printf("%lld",x)
    #define P_ printf(" ")
    const int MAXN=1010;
    const int MAXM=50010;
    int vis[MAXN],dis[MAXN],pre[MAXN];
    int mp[MAXN][MAXN];
    int n,k,edgnum;
    void print(int x){
    	if(x==0)return;
    	print(pre[x]);
    	printf("%d
    ",x);
    }
    void dijkscra(int sx){
    	mem(dis,INF);mem(vis,0);
    	dis[sx]=1;//vis[sx]=1;
    	while(true){
    		int t=-1,i;
    		F(i,n){
    			if(!vis[i]&&(t==-1||dis[i]<dis[t]))t=i;
    		}
    		if(t==-1)break;
    		vis[t]=1;
    		F(i,n)dis[i]=min(dis[i],dis[t]+mp[t][i]);
    	}
    	if(dis[k]==INF){
    		puts("-1");return;
    	}
    	printf("%d
    ",dis[k]);
    	//print(k);
    }
    int main(){
    	  while(~scanf("%d%d",&n,&k)){
    	  	mem(mp,INF);mem(pre,0);
    	  	int i,j,u,v;
    	  	F(i,n){
    	  		scanf("%d%d",&u,&v);
    	  		mp[u][v]=1;
    		  }
    		  dijkscra(1);
    	  }
    	return 0;
    }
    
  • 相关阅读:
    CentOS查看系统信息和资源使用已经升级系统的命令
    192M内存的VPS,安装Centos 6 minimal x86,无法安装node.js
    Linux限制资源使用的方法
    多域名绑定同一IP地址,Node.js来实现
    iOS 百度地图大头针使用
    iOS 从app跳转到Safari、从app打开电话呼叫
    设置cell背景色半透明
    AsyncSocket 使用
    iOS 监听键盘变化
    iOS 7 标签栏控制器进行模态视图跳转后变成透明
  • 原文地址:https://www.cnblogs.com/handsomecui/p/5003356.html
Copyright © 2011-2022 走看看