您的位置:首页 > 其它

1002 图论专练 解题报告

2016-10-05 21:59 176 查看
T1 重量不同的硬币

有N(1 <= N <= 1,000)个硬币,编号为1..N。

给出W(1 <= W <= 3,000)个推断对(A,B),表示硬币A比硬币B重。

寻找并输出一个硬币编号,要求其重量明确不同于其他硬币的个数最多。如果有多个答案,输出编号最小的一个。如果给出的数据有矛盾,输出"IMPOSSIBLE"

PROBLEM NAME: coins

INPUT FORMAT:

* Line 1: 两个整数: N and W.

* Lines 2..W+1: 每行两个整数: A, B

OUTPUT FORMAT:

* Line 1: 重量不同于其他硬币的个数最多的硬币编号。

【题解】

根据题意建图,注意正反图都要建(蒟蒻考试时没有建反图,挂掉)

如果图中有环,显然是"IMPOSSIBLE",所以先用tarjan判环。

然后两遍dfs遍历,找到每个结点的子树大小,输出最大的编号就行了。

1 #include<iostream>
2 #include<cstdio>
3 #include<cstring>
4 #include<cstdlib>
5 #include<cmath>
6 #include<ctime>
7 #include<algorithm>
8 #include<queue>
9 using namespace std;
10 #define INF 1000000000
11 #define MAXN 1010
12 #define mod ((1<<31)-1)
13 struct node1{long long y,next,v;}e[MAXN*MAXN];
14 struct node2{long long id,v;}dis[MAXN];
15 long long n,m,len,ans=1,Link[MAXN],vis[MAXN],q[MAXN],map[MAXN][MAXN];
16 inline long long read()
17 {
18     long long x=0,f=1;  char ch=getchar();
19     while(!isdigit(ch))  {if(ch=='-')  f=-1;  ch=getchar();}
20     while(isdigit(ch))  {x=x*10+ch-'0';  ch=getchar();}
21     return x*f;
22 }
23 void insert(long long x,long long y,long long v) {e[++len].next=Link[x];Link[x]=len;e[len].y=y;e[len].v=v;}
24 bool cmp(node2 a,node2 b)  {return a.v<b.v;}
25 void spfa()
26 {
27     for(long long i=1;i<=n;i++)  dis[i].id=i,dis[i].v=INF;
28     long long head=0,tail=1;
29     q[1]=1;  vis[1]=1;  dis[1].v=0;
30     while(++head<=tail)
31     {
32         long long x=q[head];
33         for(long long i=Link[x];i;i=e[i].next)
34         {
35             if(dis[x].v+e[i].v<dis[e[i].y].v)
36             {
37                 dis[e[i].y].v=dis[x].v+e[i].v;
38                 if(!vis[e[i].y])
39                 {
40                     q[++tail]=e[i].y;
41                     vis[e[i].y]=1;
42                 }
43             }
44         }
45         vis[x]=0;
46     }
47 }
48 int main()
49 {
50     freopen("castle.in","r",stdin);
51     freopen("castle.out","w",stdout);
52     n=read();  m=read();
53     memset(map,10,sizeof(map));
54     for(long long i=1;i<=m;i++)
55     {
56         long long x=read(),y=read(),v=read();
57         insert(x,y,v);  insert(y,x,v);
58         map[x][y]=min(map[x][y],v);
59         map[y][x]=map[x][y];
60     }
61     spfa();
62     sort(dis+1,dis+n+1,cmp);
63     for(long long i=2;i<=n;i++)
64     {
65         long long temp=0;
66         for(long long j=1;j<i;j++)
67         {
68             long long x=dis[i].id,y=dis[j].id;
69             if(dis[i].v==dis[j].v+map[x][y])  temp++;
70         }
71         ans=ans*temp%mod;
72     }
73     printf("%d\n",ans);
74     return 0;
75 }


View Code
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: