一、前向星
一种数据结构,以储存边的方式来存储图。构造方法如下:读入每条边的信息,将边存放在数组中,把数组中的边按照起点顺序排序(可以使用基数排序),前向星就构造完了。前向星通常用在点的数目太多,或点之间边数太多,一般在别的数据结构不能使用的时候。除了不能直接用起点终点定位以外,前向星几乎是完美的。
第一个任务
用前向星存储图并按其规则输出每一条边
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;
}