有向图的最短路问题,坑爹啊,,用无向图代码提交后WA了n次后,又仔细看了一遍题,原来是有向图,杯具啊。。。
还有一点需要注意的是,由于要逆向思维,图要反着存,,切记,,,
AC代码:
#include<iostream> #include<string.h> #include<string> #include<algorithm> #include<queue> #include<vector> #define N 1010 #define MAX 999999999 using namespace std; struct Gnode { Gnode(){}; Gnode(int num,int len):num(num),len(len){} int num; int len; }; int dis[N]; typedef pair<int,int> pii; int n,m,s; void in(int &a) { char ch; while((ch=getchar())<'0'||ch>'9'); for(a=0;ch>='0'&&ch<='9';ch=getchar()) a=a*10+ch-'0'; } void Dijstra(vector<vector<Gnode> >&Graph) { priority_queue<pii,vector<pii>,greater<pii> >Q; for(int i=1;i<=n;++i) dis[i]=(i==s)?0:MAX; Q.push(make_pair(dis[s],s)); while(!Q.empty()) { pii cur=Q.top(); Q.pop(); int v=cur.second; if(cur.first!=dis[v]) continue; for(int i=0;i<Graph[v].size();++i) { int u=Graph[v][i].num; int len=Graph[v][i].len; if(dis[v]+len<dis[u]) { dis[u]=dis[v]+len; Q.push(make_pair(dis[u],u)); } } } } int main() { while(~scanf("%d%d%d",&n,&m,&s)) { vector<vector<Gnode> >Graph(n+5); for(int i=0;i!=m;++i) { int a,b,c; in(a),in(b),in(c); Graph[b].push_back(Gnode(a,c)); } Dijstra(Graph); int t; in(t); int ans=MAX; for(int i=0;i!=t;++i) { int a; in(a); if(ans>dis[a]) ans=dis[a]; } if(ans==MAX) printf("-1\n"); else printf("%d\n",ans); }return 0; }
邻接矩阵+优先队列:
#include<queue> #include<stdio.h> #include<stdlib.h> #include<string.h> #include<iostream> using namespace std; #define N 1005 #define MAX 999999999 int map[N][N], LowCost[N], n, m, s; bool flag[N]; void in(int &a) { char ch; while((ch=getchar())<'0'||ch>'9'); for(a=0;ch>='0'&&ch<='9';ch=getchar()) a=a*10+ch-'0'; } struct POW{ int i,v; friend bool operator<(POW a,POW b) { return a.v>b.v; } }; void Dijkstra(){ priority_queue<POW>Q; POW temp ; for(int i=1 ; i<=n ; i++){ flag[i] = 0; LowCost[i] =(i==s)?0:map[s][i]; temp.i = i; temp.v =LowCost[i]; Q.push(temp); } int num=0; while(!Q.empty()) { POW cur=Q.top(); Q.pop(); int v=cur.v; int k=cur.i; if(flag[k]) continue; if(v==MAX||num==n-1) break; flag[k]=1; num++; for(int j=1; j<=n; j++ ) if(!flag[j] && (map[k][j]+v) < LowCost[j] ){ LowCost[j] = map[k][j] + v ; temp.i =j; temp.v = LowCost[j]; Q.push(temp); } } } void Init(){ for(int i=1 ; i<=n ; i++ ) for(int j=1 ; j<=n ; j++ ) map[i][j]=MAX; } int main(){ int i, x, y, weight; while( ~scanf("%d" , &n)){ in(m),in(s); Init(); for( i=0 ; i<m ; i++ ){ in(x),in(y),in(weight); if(map[y][x]>weight) map[y][x]=weight; } Dijkstra(); int w ,start; in(w); int Min = MAX; for( i=0 ; i<w ; i++){ in(start); if (Min > LowCost[start]) Min=LowCost[start]; } printf("%d\n", Min==MAX?-1:Min ); } return 0 ; }