delete pics to save space
This commit is contained in:
101
2.1599.cpp
Normal file
101
2.1599.cpp
Normal file
@ -0,0 +1,101 @@
|
||||
#include<cstdio>
|
||||
#include<cstring>
|
||||
#include<queue>
|
||||
using namespace std;
|
||||
const int MAXN=100000;
|
||||
struct node
|
||||
{
|
||||
int v,c;
|
||||
node *next;
|
||||
}edge[MAXN*4+10];
|
||||
node *adj[MAXN+10];
|
||||
node *ecnt=edge;
|
||||
inline void addedge(int u,int v,int c)
|
||||
{
|
||||
node *p=++ecnt;
|
||||
p->v=v;
|
||||
p->c=c;
|
||||
p->next=adj[u];
|
||||
adj[u]=p;
|
||||
}
|
||||
int d[MAXN+10],path[MAXN+10];
|
||||
bool vis[MAXN+10];
|
||||
queue<int> q;
|
||||
int n,m;
|
||||
void bfs1(int s)
|
||||
{
|
||||
memset(d,0,sizeof(d));
|
||||
d[s]=1;
|
||||
q.push(s);
|
||||
while (!q.empty())
|
||||
{
|
||||
int u=q.front();
|
||||
q.pop();
|
||||
for(node *p=adj[u];p;p=p->next)
|
||||
{
|
||||
int v=p->v;
|
||||
if(!d[v])
|
||||
{
|
||||
d[v]=d[u]+1;
|
||||
q.push(v);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
queue<pair<int,int>> q2;
|
||||
void bfs2(int s)
|
||||
{
|
||||
memset(path,0x3f,sizeof(path));
|
||||
memset(vis,0,sizeof(vis));
|
||||
q2.push(make_pair(s,0));
|
||||
path[0]=0;
|
||||
while(!q2.empty())
|
||||
{
|
||||
int u=q2.front().first;
|
||||
int cy=q2.front().second;
|
||||
q2.pop();
|
||||
if(path[d[1]-d[u]]!=cy||vis[u]) continue;
|
||||
vis[u]=true;
|
||||
for (node *p=adj[u];p;p=p->next)
|
||||
{
|
||||
int v=p->v;
|
||||
int c=p->c;
|
||||
if (d[u] != d[v] + 1 || path[d[1] - d[v]] <= c) continue;
|
||||
path[d[1]-d[v]]=c;
|
||||
}
|
||||
for(node *p=adj[u];p;p=p->next)
|
||||
{
|
||||
int v=p->v;
|
||||
int c=p->c;
|
||||
if(d[u]!=d[v]+1||path[d[1]-d[v]]!=c) continue;
|
||||
q2.push(make_pair(v,c));
|
||||
}
|
||||
}
|
||||
d[1]--;
|
||||
int i;
|
||||
printf("%d\n",d[1]);
|
||||
for(i=1;i<=d[1];i++)
|
||||
printf("%d%c",path[i],i==d[1]?'\n':' ');
|
||||
}
|
||||
|
||||
int main()
|
||||
{
|
||||
#ifdef local
|
||||
freopen("pro.in","r",stdin);
|
||||
#endif
|
||||
int u,v,w,i;
|
||||
while(scanf("%d%d",&n,&m)==2)
|
||||
{
|
||||
memset(adj,0,sizeof(adj));
|
||||
ecnt=edge;
|
||||
for(i=1;i<=m;i++)
|
||||
{
|
||||
scanf("%d%d%d",&u,&v,&w);
|
||||
addedge(u,v,w);
|
||||
addedge(v,u,w);
|
||||
}
|
||||
bfs1(n);
|
||||
bfs2(1);
|
||||
}
|
||||
return 0;
|
||||
}
|
Reference in New Issue
Block a user