题目:http://www.gdfzoj.com/oj/contest/467/problems/2
很简单的最短路径
spfa即可
接着说说领接表
定义:
node edge[2*maxE+5];
void addedge(int x,int y,int z)
{
t1++;
edge[t1].u=x;
edge[t1].v=y;
edge[t1].w=z;
edge[t1].next=head[x];
head[x]=t1;
}
注意:
1,开数组开2*边数
2,最后两句背一下
3,edge数组从1开始
循环:(最好背一下)
for (i=head[x];i;i=edge[i].next)
代码:
#include <cstdio>
#include <algorithm>
#include <queue>
#include <vector>
#include <cstring>
using namespace std;
struct node
{
int u,v,w,next;//u起点v终点w权值next
};
struct node1
{
int x,y,z;
};
const int maxS=5000000,maxE=10000000;
vector <node> M[maxS+5];
int n,m,t,t1=0;
int vis[maxS+5],dis[maxS+5],head[maxS+5];
node edge[maxE+5];
node1 a[maxS+5];
queue <int> q;
void addedge(int x,int y,int z)//!!!!!
{
t1++;
edge[t1].u=x;
edge[t1].v=y;
edge[t1].w=z;
edge[t1].next=head[x];
head[x]=t1;
}
void spfa()
{
int i,x;
node n1;
q.push(1); vis[1]=1; dis[1]=0;
while (!q.empty())
{
x=q.front(); q.pop(); vis[x]=0;
for (i=head[x];i;i=edge[i].next)//!!!
{
if (dis[x]+edge[i].w<dis[edge[i].v])
{
dis[edge[i].v]=dis[x]+edge[i].w;
if (vis[edge[i].v]==1)
continue;
vis[edge[i].v]=1;
q.push(edge[i].v);
}
}
}
}
bool cmp(node1 x,node1 y)
{
if (x.x==y.x)
return x.y<y.y;
else
return x.x<y.x;
}
int main()
{
int i,tmp;
node n1;
t1=0;
freopen("a.txt","r",stdin);
scanf("%d%d%d",&n,&m,&t);
for (i=1;i<=m;i++)
{
scanf("%d%d%d",&a[i].x,&a[i].y,&a[i].z);
if (a[i].x>a[i].y)
{
tmp=a[i].x; a[i].x=a[i].y; a[i].y=tmp;
}
}
sort(a+1,a+m+1,cmp);
for (i=1;i<=m;i++)
{
if (a[i].x==a[i-1].x && a[i].y==a[i-1].y)
continue;
addedge(a[i].x,a[i].y,a[i].z);
addedge(a[i].y,a[i].x,a[i].z);
}
memset(vis,0,sizeof(vis));
memset(dis,0x3f,sizeof(dis));
spfa();
printf("%d\n",dis[t]);
return 0;
}