Time Limit: 1000MS | Memory Limit: 65536K | |
Total Submissions: 46982 | Accepted: 15988 |
Description
Input
Output
Sample Input
5 5 1 2 20 2 3 30 3 4 20 4 5 20 1 5 100
Sample Output
90
Hint
Source
题意:
裸SPFA.....
那个啊哈算法里面的SPFA的模板 打了之后会T....
然后翻红书的模板..发现它用了vector来维护优先队列- -可惜还是不太会。。
代码:
#include
#include
#include
#include
using namespace std;
struct node {
int next;
int v;
int val;
}edge[100001];
int head[10001],n,m,visit[10001],cnt,d[10001];
queue q;
void add(int x,int y,int z)
{
edge[++cnt].v=y;
edge[cnt].next=head[x];
edge[cnt].val=z;
head[x]=cnt;
}
int main()
{
int x,y,z;
while(scanf("%d%d",&n,&m)==2)
{
memset(head,-1,sizeof(head));
memset(d,214546,sizeof(d));
memset(visit,0,sizeof(visit));
while(!q.empty() ){
q.pop() ;
}
for(int i=1;i<=n;i++)
{
scanf("%d%d%d",&x,&y,&z);
add(x,y,z);
add(y,x,z);
}
q.push(1);
visit[1]=1;
d[1]=0;
while(!q.empty())
{
int a=q.front();
q.pop();
visit[a]=0;
for(int i=head[a];i!=-1;i=edge[i].next)
{
if(d[edge[i].v]>d[a]+edge[i].val)
{
if(!visit[edge[i].v]){
d[edge[i].v]=d[a]+edge[i].val;
q.push(edge[i].v);
visit[edge[i].v]=1;
}
else {
d[edge[i].v]=d[a]+edge[i].val;
}
}
}
}
printf("%d ",d[m]);
}
return 0;
}
//啊哈算法 超时的算法
#include
#include
#include
#include
#include
#include
#include
#include
using namespace std;
#define N 1005
int u[N],v[N],w[N];
int first[N],next[N];
int dis[N]={0},book[N]={0};
int que[N]={0},head=1,tail=1;
int inf=0x3f3f3f;
int main()
{
int t,n;
while(scanf("%d%d",&t,&n)!=EOF)
{
int k;
for(int i=1;i<=n;i++)
{
dis[i]=inf;
book[i]=0;
first[i]=-1;
}
dis[1]=0;
for(int i=1;i<=t;i++)
{
scanf("%d%d%d",&u[i],&v[i],&w[i]);
next[i]=first[u[i]];
first[u[i]]=i;
}
//入队
que[tail]=1;tail++;
book[1]=1;
while(headdis[u[k]]+w[k])
{
dis[v[k]]=dis[u[k]]+w[k];
if(book[v[k]]==0)
{
que[tail]=v[k];
tail++;
book[v[k]]=1;
}
}
k=next[k];
}
book[que[head]]=0;
head++;
}
printf("%d\n",dis[n]);
}
return 0;
}