特判题
题意:给一张无向图,再以source为起点重新标记下边。再按照原来输入的次序 输出;
直接邻接矩阵,近600ms
#include <stdio.h>
#include <string.h>
#include <algorithm>
using namespace std;
#include <queue>
#define M 2501
int k,n,m;
int map[M][M];
int a[M*10],b[M*10];
bool vis[M][M];
queue<int> q;
int num=1;
void BFS(int x)
{
int dx,i;
num=1;
q.push(x);
while(!q.empty())
{
dx=q.front();
q.pop();
for(i=1;i<=n;i++)
{
if(!vis[i][dx]&&map[dx][i]!=-1&&dx!=i)
{
map[i][dx]=map[dx][i]=num++;//重新编号
q.push(i);
vis[i][dx]=vis[dx][i]=true;//访问过的边
}
}
}
}
inline void init()
{
memset(map,-1,sizeof(map));
memset(a,0,sizeof(a));
memset(b,0,sizeof(b));
memset(vis,false,sizeof(vis));
while(!q.empty())
q.pop();
}
int main()
{
int t,i,c,cas=1;
scanf("%d",&t);
while(t--)
{
init();
scanf("%d%d%d",&n,&m,&k);
for(i=0;i<m;i++)
{
scanf("%d%d%d",&a[i],&b[i],&c);
map[a[i]][b[i]]=0;
map[b[i]][a[i]]=0;
}
BFS(k);
printf("Case %d:\n",cas++);
for(i=0;i<m;i++)
{
printf("%d %d %d\n",a[i],b[i],map[a[i]][b[i]]);
}
}
return 0;
}
链表:30ms
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <limits.h>
#include <malloc.h>
#include <ctype.h>
#include <math.h>
#include <string>
#include <algorithm>
using namespace std;
#include <queue>
bool vis[2505];
int w[2505], v[500005], next[500005];
int a[500005], b[500005];
int ans[500005];
int d;
queue<int> q;
void build(int x,int y)
{
v[d]=y;
next[d]=w[x];
w[x]=d;
d++;
}
int main()
{
int t, n, m, s, c, i, ca=0;
int front, rear;
scanf("%d", &t);
while(t--)
{
ca++;
scanf("%d%d%d", &n, &m, &s);
d=1;
memset(vis, 0, sizeof(vis));
memset(w, 0, sizeof(w));
for(i=0;i<m;i++)
{
scanf("%d%d%d", &a[i], &b[i], &c);
build(a[i],b[i]);
build(b[i],a[i]);//建链表
ans[i]=0;
}
printf("Case %d: \n",ca);
q.push(s);
vis[s]=true;
c=1;
while(!q.empty())
{
front=q.front();
q.pop();
for(i=w[front];i;i=next[i]){
rear=v[i];
if(vis[rear]==false){
q.push(rear);
vis[rear]=true;
ans[(i-1)/2]=c;
c++;
}
}
}
for(i=0;i<m;i++)
{
printf("%d %d ", a[i], b[i]);
if(ans[i])
printf("%d\n", ans[i]);
else
{
printf("%d\n", c);
c++;
}
}
}
return 0;
}