前向星及spfa大法

前向星是一种用于存储图的数据结构,尤其适用于点数众多或边数过多的情况。它通过按起点排序边来构建,并能有效地输出图的边。例如,在一个5个顶点、7条边的图中,前向星可以方便地组织和输出边的信息。
摘要由CSDN通过智能技术生成

一、前向星

一种数据构,以的方式来存储图。构造方法如下:入每条的信息,将存放在数组中,把数中的按照起点序排序(可以使用基数排序),前向星就构造完了。前向星通常用在点的数目太多,或点之间边数太多,一般在的数据构不能使用的。除了不能直接用起点点定位以外,前向星几乎是完美的。

第一个任

用前向星存储图并按其规则输出每一条

n为图的顶点数,m为该图有多少条边

接下来m行为每条边的起始点

入:

5 7

1 2

2 3

3 4

1 3

4 1

1 5

4 5

出:

1 5

1 3

1 2

2 3

3 4

4 5

4 1

#define N 500005
struct Edge{//用Edge类型来存储图的每一条边
  int to,next,w;
}edge[N];
int cnt,head[N];//cnt用于记录每一条边的编号
void Add_edge(int u,int v,int w){
  edge[++cnt].to=v;
  edge[cnt].w=w;
  edge[cnt].next=head[u];
  head[u]=cnt;
}
int main(){
  int i,m,u,v,w;
  cin>>n>>m;
  for(i=0;i<m;i++){
    cin>>u>>v>>w;
    Add_edge(u,v,w);
  }
  for(u=1;u<=n;u++)		   
    for(i=head[u];i;i=edge[i].next){
      v=edge[i].to;
      cout<<u<<' '<<v<<endl;
    }
  return 0;
}

 

uv
104
2354



#include<queue>
#define N 500005
using namespace std;
int d[N],vis[N],flag[N],head[N],n,m,cnt;
const int inf=0x3fffffff;
struct Edge{
int to,next,w;
}edge[N];
queue <int> q;
void add_edge(int u,int v,int w){
edge[++cnt].to=v;
edge[cnt].w=w;
edge[cnt].next=head[u];
head[u]=cnt;
}
void spfa(){
int i,w,u,v;
for(i=1;i<=m;i++)
d[i]=-inf;
q.push(1);
vis[1]++;
d[1]=100;
while(!q.empty()){
u=q.front();
flag[u]=0;
q.pop();
for(i=head[u];i;i=edge[i].next){
v=edge[i].to;
w=edge[i].w;
//cout<<u<<' '<<v<<' '<<d[u]<<' '<<d[v]<<' ';
if(d[u]+w>0&&d[u]+w>d[v]){
d[v]=d[u]+w;
if(!flag[v]){
if(vis[v]>n){
edge[i].w=-inf;
}
else{
vis[v]++;
q.push(v);
flag[v]=1;
}
}
}
cout<<d[v]<<endl;
}
}
}
int main(){
ios::sync_with_stdio(false);
//freopen("spfa1.in","r",stdin);
int j,u,w,v,hn;
cin>>n;
for(u=1;u<=n;u++){
cin>>w>>hn;
m+=hn;
for(j=0;j<hn;j++){
cin>>v;
add_edge(u,v,w);
}
}
spfa();
if(d[n]>0)cout<<"Yes";
else cout<<"No";
return 0;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值