Time Limit: 1000MS | Memory Limit: 65536K | |||
Total Submissions: 4080 | Accepted: 1742 | Special Judge |
Description
Input
Output
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\n",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\n",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\n",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\n",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\n",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\n",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; }
原文:http://www.cnblogs.com/handsomecui/p/5003356.html