这里用了十字链表解决(但是在平台运行时产生了内存超限问题)
//互粉问题
//有向图的问题
//人气指数->入度减去出度
//n个人 m条关注信息->所有的度数
#include<iostream>
using namespace std;
struct Anode{//弧节点
int tail,head;
struct Anode*hlink,*tlink; //类似于并联的
};
struct Vnode{
//顶点
int data;
Anode *fin,*fout;
};
Vnode* conVnode(int n,int m){
Vnode* G=new Vnode[n];
for(int i=0;i<n;i++){
G[i].data=i;//编号
G[i].fin=NULL;
G[i].fout=NULL;
}
for(int i=0;i<m;i++){
//创建图
int a,b;
cin>>a>>b;
Anode *newarc=new Anode;
newarc->tail=a;
newarc->head=b;
newarc->hlink=NULL;
newarc->tlink=NULL;//初始化
Anode *phead=G[b].fin;
Anode *ptail=G[a].fout;
//检索重复功能
Anode *current=G[a].fout;
int tag=0;//不重复显示0
while(current!=NULL){
if(current->tail==a&¤t->head==b)
{
tag=1;
break;
}
else
current=current->tlink;
}
if(tag==1)
{
continue;
}
else{
if(phead==NULL){
newarc->hlink=NULL;
}
else{
newarc->hlink=phead;
}
if(ptail==NULL){
newarc->tlink=NULL;
}
else{
newarc->tlink=ptail;
}
G[a].fout=newarc;
G[b].fin=newarc;
}
}
return G;
}
int f(Vnode &G){
//计算粉丝
int m=0;
Anode *current1=G.fin;
if(current1==NULL){
m=0;
}
else{
m=1;
while(current1->hlink!=NULL){
m++;
current1=current1->hlink;
}
}
int n=0;
Anode *current2=G.fout;
if(current2==NULL){
n=0;
}
else{
n=1;
while(current2->tlink!=NULL){
n++;
current2=current2->tlink;
}
}
//cout<<m<<" "<<n<<endl;
int s=m-n;
return s;
}
int main(){
int n,m;
cin>>n>>m;
Vnode* G=conVnode(n,m);//用十字链表方式
for(int i=0;i<n;i++){
cout<<f(G[i])<<endl;
}
}
用邻接矩阵解决
#include <iostream>
using namespace std;
int n,m;
int din[1001],dout[1001];
bool vis[1001][1001];
int main() {
cin>>n>>m;
for(int i=0;i<m;i++){
int a,b;
cin>>a>>b;
if(!vis[a][b]){
vis[a][b]=true;
din[b]++;
dout[a]++;
}
}
for(int i=0;i<n;i++){
cout<<din[i]-dout[i]<<endl;
}
return 0;
}
直接用两个数组解决了关注和被关注的问题,非常简单