PAT中图论问题大多是STL或dijkstra就可以解决的
朴素版,大多数情况下用这个即可
#include<bits/stdc++.h>
#define rep(i,a,n) for(int i=a;i<n;i++)
#define INF 0x3f3f3f3f
using namespace std;
const int N=2333;
int n,m,k;
int g[N][N];
int dist[N],vis[N];
int dijkstra(int S,int T){
memset(dist,INF,sizeof dist);
memset(vis,0,sizeof vis);
dist[S]=0;
rep(i,1,n+1){
int t=-1;
rep(j,1,n+1)
if(!vis[j]&&(t==-1||dist[j]<dist[t]))
t=j;
vis[t]=1;
rep(j,1,n+1){
if(dist[j]>dist[t]+g[t][j]){
dist[j]=dist[t]+g[t][j];
pre[j]=t;
}
}
}
/*路径输出
vector<int>path;
for(int i=T;i!=S;i=pre[i]) path.push_back(i);
cout<<S;
for(int i=path.size()-1;i>=0;i--) cout<<" "<<path[i];
*/
if(dist[T]==INF) return -1;
return dist[T];
}
int main(){
memset(g,INF,sizeof g);
cin>>n>>m;
while(m--){
int x,y,z;
cin>>x>>y>>z;
g[x][y]=min(g[x][y],z);
}
cout<<dijkstra(1,n)<<endl;
return 0;
}
堆优化版,边太多的时候使用
#include<bits/stdc++.h>
#define rep(i,a,n) for(int i=a;i<n;i++)
#define PII pair<int,int>
#define x first
#define y second
#define INF 0x3f3f3f3f
using namespace std;
const int N=2e5+10;
const int M=2e5+10;
struct node{
int to,next;
int w;
}E[M];
int head[N],tot;
int dist[N],cnt[N],pre[N];
int stops[N];
int vis[N];
void add(int a,int b,int c){
E[tot].w=c;
E[tot].to=b,E[tot].next=head[a],head[a]=tot++;
}
void dijkstra(int S,int T){
memset(dist,INF,sizeof(dist));
memset(vis,0,sizeof(vis));
dist[S]=0;
priority_queue<PII,vector<PII>,greater<PII>> heap;
heap.push({dist[S],S});
while(heap.size()){
auto t=heap.top();
heap.pop();
int u=t.y;
if(u==T)break;
if(vis[u])continue;
vis[u]=1;
for(int i=head[u];~i;i=E[i].next){
int v=E[i].to,w=E[i].w;
if(dist[v]>dist[u]+w){
dist[v]=dist[u]+w;
heap.push({dist[v],v});
}
}
}
if(dist[T]==INF) puts("-1");
else cout<<dist[T]<<endl;
}
int n,m;
int main(){
memset(head,-1,sizeof(head));
cin>>n>>m;
while(m--){
int a,b,c;
cin>>a>>b>>c;
add(a,b,c);
}
dijkstra(1,n);
return 0;
}