天天高高兴兴打打模板
#include<cmath>
#include<queue>
#include<cstdio>
#include<vector>
#include<cstring>
#include<algorithm>
using namespace std;
const int MAXN=100;
const int MAXM=1000;
const int INF=0x3f3f3f3f;
int N,M;
int Mix[MAXN][MAXN];//邻接矩阵存图
struct edge//临界表存图
{
int to,val;
bool operator < (const edge & p) const
{
return val<p.val;
}
}h;
vector <edge> G[MAXN];
int cnt,head[MAXN];
void addedge(int u,int v,int w)
{
h.to=v,h.val=w;
G[u].push_back(h);
}
//多源点最短路:Floyd
int dis[MAXN][MAXN];
void Floyd()
{
//dis初值:如果i==j,dis=0,如果i,j有连边,dis=边权,否则dis=INF
for(int k=1;k<=N;k++)
for(int i=1;i<=N;i++)
for(int j=1;j<=N;j++)
dis[i][j]=min(dis[i][j],dis[i][k]+dis[k][j]);
}
//单源点最短路:Spfa,dijkstra
int Dis[MAXN];
bool inq[MAXN];
int showup[MAXN];
int Spfa(int s,int t)
{
queue<int>Q;
for(int i=1;i<=N;i++) Dis[i]=(i==s)?0:INF;
Q.push(s),inq[s]=1,showup[s]++;
int v,p,m,sz;
while(!Q.empty())
{
p=Q.front(),Q.pop(),inq[p]=0,
sz=G[p].size();
for(int i=0;i<sz;i++)
{
v=G[p][i].val,m=G[p][i].to;
if(Dis[m]>v+Dis[t])
{
Dis[m]=v+Dis[t];
if(!inq[m])
{
Q.push(m),inq[m]=1,showup[m]++;
if(showup[m]>N) return -1;
}
}
}
}
if(Dis[t]==INF) return -2;
return Dis[t];
}
void dijkstra(int s,int t)
{
priority_queue<edge>Q;
for(int i=1;i<=N;i++) Dis[i]=(i==s)?0:INF;
h.to=s,h.val=0;
Q.push(h);
while(!Q.empty())
{
edge x=Q.top();Q.pop();
int sz=G[x.to].size();
for(int i=0;i<sz;i++)
{
edge y=G[x.to][i];
if(Dis[y.to]>x.val+y.val)
{
Dis[y.to]=x.val+y.val;
h.to=y.to,h.val=Dis[y.to];
Q.push(h);
}
}
}
}
int main()
{
}