初次接触次短路 模板题
#include <bits/stdc++.h>
using namespace std;
#define N 0x3f3f3f3f
struct node1
{
int v;
int w;
};
struct node2
{
friend bool operator < (node2 n1,node2 n2)
{
return n1.s>n2.s;
}
int id;
int s;
int type;
};
vector <node1> edge[1010];
int dis[1010][2],book[1010][2];
int n,m;
void calculate();
int main()
{
node1 cur;
int i,j,v,w;
while(scanf("%d",&n)!=EOF)
{
for(i=1;i<=n;i++)
{
edge[i].clear();
}
for(i=1;i<=n;i++)
{
scanf("%d",&m);
for(j=1;j<=m;j++)
{
scanf("%d%d",&v,&w);
cur.v=v,cur.w=w;
edge[i].push_back(cur);
}
}
calculate();
printf("%d\n",dis[n][1]);
}
return 0;
}
void calculate()
{
priority_queue <node2> que;
node1 tem;
node2 cur;
int i,p,type;
memset(dis,0x3f,sizeof(dis));
memset(book,0,sizeof(book));
dis[1][0]=0;
cur.id=1,cur.s=0,cur.type=0;
que.push(cur);
while(!que.empty())
{
cur=que.top();
que.pop();
p=cur.id,type=cur.type;
if(book[p][type]==1) continue;
book[p][type]=1;
for(i=0;i<edge[p].size();i++)
{
tem=edge[p][i];
if(book[tem.v][0]==0&&dis[tem.v][0]>dis[p][type]+tem.w)
{
dis[tem.v][1]=dis[tem.v][0];
cur.id=tem.v,cur.s=dis[tem.v][1],cur.type=1;
que.push(cur);
dis[tem.v][0]=dis[p][type]+tem.w;
cur.id=tem.v,cur.s=dis[tem.v][0],cur.type=0;
que.push(cur);
}
else if(book[tem.v][1]==0&&dis[tem.v][1]>dis[p][type]+tem.w)
{
dis[tem.v][1]=dis[p][type]+tem.w;
cur.id=tem.v,cur.s=dis[tem.v][1],cur.type=1;
que.push(cur);
}
}
}
return;
}