前向星:
#include<iostream>
#include<cstring>
#include<algorithm>
using namespace std;
const int maxn = 100001;
int head[maxn]; //储存起点为vi的第一条边的位置
int n,m;
struct Node
{
int from;
int to;
int w;
}edge[maxn*3];
bool cmp(Node a,Node b)
{
if(a.from == b.from && a.to == b.to)
return a.w < b.w;
if(a.from == b.from) return a.to < b.to;
return a.from < b.from;
}
void input()
{
scanf("%d%d",&n,&m);
int i;
for(i=0;i<m;i++)
{
scanf("%d%d%d",&edge[i].from,&edge[i].to,&edge[i].w);
}
sort(edge,edge+m,cmp);
memset(head,-1,sizeof(head));
head[edge[0].from] = 0;
for(i=0;i<m;i++)
{
if(edge[i].from != edge[i-1].from)
head[edge[i].from] = i; //确定起点为vi的第一条边的位置
}
}
void traver()
{
int i,k;
for(i=1;i<=n;i++)
{
for(k=head[i];edge[k].from == i && k < m;k++)
{
printf("%d %d %d\n",edge[k].from,edge[k].to,edge[k].w);
}
}
}
int main()
{
input();
traver();
return 0;
}
链式前向星:
#include<iostream>
#include<cstring>
using namespace std;
const int maxn = 100001;
int head[maxn];
struct EdgeNode
{
int to;
int w;
int next;
};
EdgeNode Edges[maxn * 3];
int k;
void init()
{
int i;
memset(head,-1,sizeof(head));
k = 0;
}
void add(int i,int j,int w)
{
Edges[k].w = w;
Edges[k].to = j;
Edges[k].next = head[i];
head[i] = k++;
}
void traver(int m)
{
int i,p;
for(p=1;p<=m;p++)
for(i=head[p];~i;i=Edges[i].next)
{
printf("%d %d %d\n",p,Edges[i].to,Edges[i].w);
}
}
int main()
{
int m,n;
int i;
int num1,num2,we;
freopen("1.txt","r",stdin);
scanf("%d%d",&m,&n); //m个点,n条边
init();
for(i=0;i<n;i++)
{
scanf("%d%d%d",&num1,&num2,&we);
add(num1,num2,we);
}
traver(m);
return 0;
}