写一个Spfa()记录最短路路径,我们只需要一个辅助的数组link[ ]
即可
例题:
ac代码:
#include<bits/stdc++.h>
using namespace std;
#define maxn 10005
#define judge 0x3f3f3f3f
struct node
{
int u,v,w;
} temp;
int n,m;
vector<node>vec[maxn];
int dis[maxn],vis[maxn],link[maxn];
int id[maxn];
void spfa(int u,int v)//单源点
{
memset(link,0,sizeof(link));
memset(dis,judge,sizeof(dis));
memset(vis,0,sizeof(vis));
queue<int>q;
dis[u]=0;
q.push(u);//入队
while(!q.empty())
{
int x=q.front();
vis[x]=0;
q.pop();
for(int i=0; i<vec[x].size(); i++)
{
int v=vec[x][i].v;
int w=vec[x][i].w;
if(dis[v]>dis[x]+w)
{
link[v]=x;//记录路径
dis[v]=dis[x]+w;
if(!vis[v])
{
vis[v]=1;
q.push(v);
}
}
}
}
//printf("cost:%d\n",dis[v]);
}
void input()
{
for(int i=0; i<m; i++)
{
int u,v,w;
scanf("%d %d %d",&u,&v,&w);
temp.v=v;
temp.w=w;
vec[u].push_back(temp);
//temp.u=u;
//vec[v].push_back(temp);
}
}
int main()
{
int t;
scanf("%d",&t);
while(t--)
{
memset(vec,0,sizeof(vec));
scanf("%d %d",&n,&m);
input();
int u,v,k;
scanf("%d",&k);
while(k--)
{
memset(id,0,sizeof(id));
scanf("%d %d",&u,&v);
spfa(u,v);
id[u]=1;
if(dis[v]==judge)
{
printf("oh my god!\n");
continue;
}
else
{
printf("cost: %d\n",dis[v]);
}
for(int i=v; i!=u; i=link[i])
{
id[i]=1;
}
//printf("%d\n",n);
for(int j=1; j<=n*n; j++)
{
if(j%n==0)
{
if(id[j])
printf("@\n");
else
printf(".\n");
}
else
{
if(id[j])
printf("@");
else
printf(".");
}
}
}
if(t)
printf("\n");
}
}