前向星及spfa大法

一、前向星

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

第一个任

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

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;
}

 

u v
10 4
23 54



#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;
}

猜你喜欢

转载自blog.csdn.net/flymist/article/details/79250849