Time Limit: 1000MS | Memory Limit: 30000K | |
Total Submissions: 13468 | Accepted: 4954 |
Description
Input
Output
Sample Input
3 2 1 2 2 3 2 3 1 2 1 2
Sample Output
0
Source
原题链接:http://poj.org/problem?id=1847
就是有n个交叉点,就当做有n个点就行,然后这些点和其他点有些路径,每个点是一个开关,开关只能有一个方向走一条路,而第一个数就是默认的开关指向,不用旋转。
这单犯了个错,就是默认的指向实际上只需要旋转0次,而其他路径只需要旋转1次,无论是哪条,只需1次,当初以为,第二个1次,第3个2次。
题目给的实例
3 2 1 //有3个开关点,计算从第二个到第一个最少需要旋转几次
2 2 3//第1个开关可以通向2 和3 ,通向2不需要旋转,通向3需要旋转1次
2 3 1//第2个开关可以通向3 和1, 通向3不需要旋转,通向1需要旋转1次
2 1 2//第3个开关可以通向1和2, 通向1不需要旋转,通向2需要旋转1次
知道题目意思后还有问题吗?
Dijkstra算法,Floyd算法,spfa算法都来了!!
AC代码:
#include <iostream> #include <cstdio> #include <queue> using namespace std; const int INF=0x3f3f3f3f; int a[105][105]; int dis[105]; bool vis[105]; int n,s,t; void Dij() { for(int i=1; i<=n; i++) { dis[i]=a[s][i]; vis[i]=false; } vis[s]=true; dis[s]=0; for(int i=1; i<=n; i++) { int minn=INF; int p; for(int j=1; j<=n; j++) { if(!vis[j]&&dis[j]<minn) { minn=dis[j]; p=j; } } vis[p]=true; //if(minn==INF) break; for(int j=1; j<=n; j++) { if(!vis[j]&&dis[j]>dis[p]+a[p][j]) dis[i]=dis[p]+a[p][j]; } } } void floyd() //floyd 算法 { for (int i = 1; i <= n; ++ i) { for (int j = 1; j <= n; ++ j) { for (int k = 1; k <= n; ++ k) { if (a[j][k] > a[j][i] + a[i][k]) { a[j][k] = a[j][i] + a[i][k]; } } } } if (a[s][t] >= INF) printf("-1\n"); else printf("%d\n", a[s][t]); } void spfa() { for(int i=1;i<=n;i++) { dis[i]=INF; vis[i]=false; } dis[s]=0; vis[s]=true; queue<int>q; q.push(s); while(!q.empty()) { int p=q.front(); q.pop(); vis[p]=false;///!!!!!! for(int i=1;i<=n;i++) { if(dis[i]>dis[p]+a[p][i]) { dis[i]=dis[p]+a[p][i]; if(!vis[i]) { vis[i]=true; q.push(i); } } } } } int main() { while(cin>>n>>s>>t) { for(int i=1; i<=n; i++) { for(int j=1; j<=n; j++) if(i==j) a[i][j]=0; else a[i][j]=INF; } int x,y,z; for(int i=1; i<=n; i++) { scanf("%d",&x); for(int j=0; j<x; j++) { scanf("%d",&y); if(j==0) a[i][y]=0; else a[i][y]=1; } } //floyd(); //Dij(); spfa(); if(dis[t]<INF) cout<<dis[t]<<endl; else cout<<"-1"<<endl; } return 0; }
POJ 1847 Tram 【最短路,spfa算法,题意理解是关键呀!!】
原文:http://blog.csdn.net/hurmishine/article/details/52075264