额,大一暑假写的Dijkstra,还是比较干净的,翻出来存起来以后备用。
【但是最短路变形的时候,好像因为我的Dijkstra 太干净了还要改一下。。。】
#define inf 9999
#define INF 0x3f3f3f3f
#define loop(x,y,z) for(x=y;x<z;x++)
//下标自1始
int book[inf],e[inf][inf],dis[inf];
int n,m,s; //起点 s 边的记录注意要判断重边
int init()
{
int i,j;
loop(i,1,n+1)
loop(j,1,n+1)
e[i][j]=(i==j)?0:INF;
memset(book,0,sizeof book);
}
void Dijkstra()
{
int i,j,mini,u;
loop(i,1,n+1)dis[i]=e[s][i];
loop(i,0,n)
{
mini=INF;
loop(j,1,n+1)
if(!book[j]&&dis[j]<=mini)
mini=dis[u=j];
book[u]=1;
loop(j,1,n+1)
if(dis[j]>dis[u]+e[u][j])
dis[j]=dis[u]+e[u][j];
}
}